Пустые зависимости с помощью useMemo или useCallback VS useRef - PullRequest
7 голосов
/ 12 ноября 2019

В этом выпуске GitHub Я, по сути, предложил изменить:

x = useCallback( ... , []);

Кому:

x = useRef( ... ).current;

Они совпадают, но с useRef Реагировать нене сравнивайте зависимости.

Для которого пришел ответ с вопросом:

Есть ли когда-нибудь ситуация, когда использование без зависимостей useMemo или useCallback было бы лучшим выбором, чем useRef?

Я не могу вспомнить ни одного, но я мог пропустить некоторые варианты использования.

Так может ли кто-нибудь подумать о такой ситуации?

Ответы [ 3 ]

5 голосов
/ 15 ноября 2019

Документация по API React Hooks:

Имейте в виду, что useRef не уведомляет вас об изменении своего содержимого. Отключение свойства .current не вызывает повторного рендеринга ... Использование обратного вызова ref гарантирует, что даже если дочерний компонент отобразит измеренный узел позже (например, в ответ на щелчок), мы все равно получимуведомляется об этом в родительском компоненте и может обновлять измерения.

Подробнее об этом можно узнать здесь и здесь .

0 голосов
/ 18 ноября 2019

Поскольку выходные данные useRef (() => {...}). Current являются изменяемыми.

, что может вызвать странные побочные эффекты в вашем коде. Я могу изменить значение тока в любое время. https://codesandbox.io/s/confident-monad-vjeuw

Это был бы вариант использования для отказа от использования useRef

0 голосов
/ 14 ноября 2019

Хотя вы можете использовать useRef для эмуляции useCallback или с пустой зависимостью, вы не можете использовать его для всех возможных сценариев использования useCallback, который должен запоминать, когда изменяется любая из зависимостей.

Кроме того, это не будет иметь большого значения для производительности, если вы используете useCallback with empty dependency или useRef, поскольку он не должен выполнять какого-либо тяжелого сравнения.

Также, если вы измените реализацию функциинемного, чтобы вам пришлось воссоздать его при конкретном изменении параметра, вы можете просто обновить реализацию с помощью useCallback и добавить дополнительный параметр в качестве зависимости. Однако, если вы реализуете его с помощью useRef, вам придется вернуться к useCallback

...