Introdus în React 18, hook-ul useInsertionEffect este proiectat cu un scop ultra-specializat: se execută înainte de orice mutație DOM și înainte ca useLayoutEffect să citească layout-ul. Scopul său exclusiv este să permită bibliotecilor de CSS-in-JS (cum ar fi Styled Components sau Emotion) să insereze elemente <style> în document înainte ca browserul să calculeze stilurile geometrice.
Injectarea unei reguli CSS dinamice
import { useInsertionEffect } from 'react';
function injecteazaStiluri(regulaCSS) {
let tagStil = document.querySelector('style[data-custom-rules]');
if (!tagStil) {
tagStil = document.createElement('style');
tagStil.setAttribute('data-custom-rules', 'true');
document.head.appendChild(tagStil);
}
tagStil.textContent += regulaCSS;
}
export function ButonTematizat({ culoare }) {
const numeClasa = `btn-dinamic-${culoare}`;
useInsertionEffect(() => {
// Inserăm regula înainte ca useLayoutEffect să măsoare elementul:
injecteazaStiluri(`.${numeClasa} { background-color: ${culoare}; color: white; padding: 10px; }`);
}, [culoare, numeClasa]);
return <button className={numeClasa}>Buton Stilizat</button>;
}
Restricție de utilizare: Nu actualizați starea React (prin
setState) și nu accesați referințe DOM (refs) în interiorul lui useInsertionEffect, deoarece nodurile DOM încă nu sunt sincronizate la momentul execuției.