Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że bezstanowe komponenty funkcjonalne nie mogą mieć metod, nie powinieneś liczyć na wywołanie updatelub drawrenderowanie, Balljeśli jest to bezstanowy składnik funkcjonalny.
W większości przypadków powinieneś zadeklarować funkcje poza funkcją komponentu, więc deklarujesz je tylko raz i zawsze ponownie używasz tego samego odniesienia. Kiedy deklarujesz funkcję wewnątrz, za każdym razem, gdy komponent jest renderowany, funkcja zostanie ponownie zdefiniowana.
Istnieją przypadki, w których będziesz musiał zdefiniować funkcję wewnątrz komponentu, aby na przykład przypisać ją jako procedurę obsługi zdarzeń, która zachowuje się inaczej w zależności od właściwości komponentu. Ale nadal możesz zdefiniować funkcję na zewnątrz Balli powiązać ją z właściwościami, dzięki czemu kod będzie znacznie bardziej przejrzysty i sprawi, że funkcje updatelub będą drawwielokrotnego użytku.
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
Jeśli używasz hooków , możesz użyć, useCallbackaby upewnić się, że funkcja zostanie przedefiniowana tylko wtedy, gdy jedna z jej zależności ( props.xw tym przypadku) ulegnie zmianie:
const Ball = props => {
const onClick = useCallback((a, b) => {
}, [props.x]);
return (
<Something onClick={onClick} />
);
}
To jest zły sposób :
const Ball = props => {
function update(a, b) {
}
return (
<Something onClick={update} />
);
}
Podczas używania useCallbackzdefiniowanie updatefunkcji w samym useCallbackhaku poza komponentem staje się bardziej decyzją projektową, niż cokolwiek innego, powinieneś wziąć pod uwagę, czy zamierzasz ponownie użyć updatei / lub jeśli potrzebujesz dostępu do zakresu zamknięcia komponentu, na przykład odczyt / zapis stanu. Osobiście wybieram zdefiniowanie go domyślnie wewnątrz komponentu i umożliwiam jego ponowne użycie tylko wtedy, gdy zajdzie taka potrzeba, aby zapobiec przeprojektowaniu od samego początku. Poza tym ponowne wykorzystanie logiki aplikacji jest lepsze dzięki bardziej szczegółowym punktom zaczepienia, pozostawiając komponenty do celów prezentacyjnych. Definiowanie funkcji poza komponentem podczas używania hooków zależy tak naprawdę od stopnia oddzielenia od Reacta, jakiego chcesz dla logiki aplikacji.