Middle
Ce reguli există pentru scrierea hook-urilor în React?
sobes.tech AI
Răspuns de la AI
- Apelați hooks doar la nivelul superior al componentelor funcționale sau în interiorul altor hooks personalizați. Nu apelați hooks în bucle, condiții sau funcții imbricate.
- Apelați hooks doar în interiorul componentelor funcționale React. Nu le apelați în funcții JavaScript normale sau în componente de clasă.
- Utilizarea
useCallbackpentru memorarea funcțiilor șiuseMemopentru memorarea calculelor ajută la optimizarea performanței. - Folosiți
useEffectpentru efecte secundare (încărcarea datelor, abonamente etc.), specificând un array de dependențe pentru a controla execuția efectului. - Respectați ordinea de apelare a hooks la fiecare randare a componentului. React se bazează pe această ordine pentru a lega corect starea și efectele.
- Utilizați dependențe stabile în array-urile de dependențe ale
useEffect,useCallback,useMemo. Nu transmiteți obiecte sau funcții create la fiecare randare fără necesitate. - Creați hooks personalizate pentru reutilizarea logicii de stare între componente. Numele hooks-urilor personalizate trebuie să înceapă cu
use.
// Exemplu corect: apelarea hooks-urilor la nivelul superior
function MyComponent() {
const [count, setCount] = useState(0); // La nivelul superior
useEffect(() => { // La nivelul superior
document.title = `Ai apăsat de ${count} ori`;
}, [count]); // Array de dependențe
const handleClick = useCallback(() => { // La nivelul superior
setCount(c => c + 1);
}, []); // Funcție memorată
return (
<div>
<p>Ai apăsat de {count} ori</p>
<button onClick={handleClick}>
Apasă-mă
</button>
</div>
);
}
// Exemplu greșit: apelarea hook-ului în condiție
// function MyComponentWithBadHook() {
// if (someCondition) {
// const [count, setCount] = useState(0); // GREȘIT: apel în condiție
// }
// // ...
// }
// Exemplu greșit: apelarea hook-ului în buclă
// function MyComponentWithAnotherBadHook() {
// for (let i = 0; i < 5; i++) {
// const [value, setValue] = useState(i); // GREȘIT: apel în buclă
// }
// // ...
// }