W tym numerze GitHub zasadniczo zaproponowałem zmianę:
x = useCallback( ... , []);
Do:
x = useRef( ... ).current;
Oba są takie same, ale w useRef
React nie porównuje zależności.
Na które nadeszła odpowiedź z pytaniem:
Czy kiedykolwiek zdarza się sytuacja, w której useMemo lub useCallback bez zależności byłoby lepszym wyborem niż useRef?
Nie mogę wymyślić jednego, ale mogłem przeoczyć niektóre przypadki użycia.
Czy ktoś może pomyśleć o takiej sytuacji?
useCallback(x,[])
nauseRef(x)
działa tak samo.useRef(x).current
to jest.useCallback(cb, [])
vsuseRef(cb).current
siebie. ChociażuseMemo(cb, [])
różni sięuseRef(cb).current
w pewnym sensie, żeuseMemo
„ponownie obliczy zapamiętaną wartość tylko wtedy, gdy zmieni się jedna z zależności”. W przeciwieństwie do tych,useRef
które zawsze przeliczają wartość bez względu na wszystko.useRef
nigdy nie przelicza - zawsze zwraca wartość początkową.Chociaż możesz użyć useRef do emulacji useCallback lub z pustą zależnością, nie możesz go użyć do wszystkich możliwych scenariuszy useCallback, które mają zostać zapamiętane, gdy zmieni się dowolna z zależności.
Również nie zrobi to dużej różnicy w wydajności, jeśli użyjesz
useCallback with empty dependency
lub użyjeszRef, ponieważ nie musi wykonywać żadnego ciężkiego porównania.Również jeśli nieco zmienisz implementację funkcji, abyś musiał odtworzyć ją przy określonej zmianie parametru, możesz po prostu zaktualizować implementację
useCallback
i dodać dodatkowy parametr jako zależność. Jeśli jednak zaimplementujesz go za pomocą useRef, musisz wrócić douseCallback
źródło
Ponieważ dane wyjściowe useRef (() => {...}). Prąd jest zmienny.
Co może powodować dziwne skutki uboczne w kodzie. W każdej chwili mogę zmienić wartość prądu. https://codesandbox.io/s/confident-monad-vjeuw
Byłby to przypadek użycia, dla którego nie chce się używać useRef
źródło
x = useRef(value).current
nigdy nie zwraca zmiennych instancji -ref
nigdy nie jest zwracane;current
jest. Tak samo jest zuseCallback
wersją.