В этом выпуске GitHub я, по сути, предложил изменить:
x = useCallback( ... , []);
Для того, чтобы:
x = useRef( ... ).current;
Они одинаковы, но с useRef
React не сравнивает зависимости.
На что пришел ответ с вопросом:
Была ли когда-нибудь ситуация, когда использование useMemo или useCallback без зависимости было бы лучшим выбором, чем useRef?
Я не могу думать об одном, но я мог пропустить некоторые варианты использования.
Так может кто-нибудь придумать такую ситуацию?
useCallback(x,[])
наuseRef(x)
тот же.useRef(x).current
это.useCallback(cb, [])
противuseRef(cb).current
себя. ХотяuseMemo(cb, [])
отличается отuseRef(cb).current
тогоuseMemo
, что «пересчитывает запомненное значение только тогда, когда одна из зависимостей изменилась». По сравнению с тем,useRef
который всегда пересчитывает значение, несмотря ни на что.useRef
никогда не пересчитывает - всегда возвращает начальное значение.В то время как вы можете использовать useRef для эмуляции useCallback или с пустой зависимостью, вы не можете использовать его для всех возможных сценариев useCallback, который должен помнить, когда изменяется любая из зависимостей.
Кроме того, это не будет иметь большого значения для производительности, если вы используете
useCallback with empty dependency
или используете Ref, так как он не должен выполнять никаких тяжелых сравнений.Также, если вы немного измените реализацию функции, чтобы вам пришлось воссоздать ее при конкретном изменении параметра, вы можете просто обновить реализацию
useCallback
и добавить дополнительный параметр в качестве зависимости. Однако, если вы реализуете это с помощью useRef, вы должны вернуться кuseCallback
источник
Потому что выходные данные useRef (() => {...}). Current являются изменяемыми.
Что может вызвать странные побочные эффекты в вашем коде. Я могу изменить значение тока в любое время. https://codesandbox.io/s/confident-monad-vjeuw
Это был бы сценарий отказа от использования useRef.
источник
x = useRef(value).current
никогда не возвращает изменяемые экземпляры -ref
никогда не возвращается;current
является. Это так же, как сuseCallback
версией.