Есть ли преимущество в производительности/удобстве использования при использовании useCallback для событий InputElement?

#javascript #reactjs

Вопрос:

Если не передавать обратный вызов дочернему элементу, а просто использовать его в текущем компоненте, есть ли польза в том, чтобы обернуть обратный вызов в a useCallback ? Этот:

  const Foo = (
  const [count, setCount] = useState(500);

  const onChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
    setCount(Number(e.target.value));
  }, [setCount]);

  return (
    <>
      <div>
        Delay: <input value={count} onChange={onChange} type="number" />
      </div>
    </>
  );
 

Стих Этот:

  const Foo = (
  const [count, setCount] = useState(500);

  const onChange =(e: React.ChangeEvent<HTMLInputElement>) => {
    setCount(Number(e.target.value));
  };

  return (
    <>
      <div>
        Delay: <input value={count} onChange={onChange} type="number" />
      </div>
    </>
  );
 

Codesandbox: https://codesandbox.io/s/loving-stonebraker-48xhs?file=/src/Counter.tsx

Ответ №1:

Я не вижу в этом никакой пользы при внутреннем использовании, поскольку каждое обновление состояния ( setCount(Number(e.target.value)); ) в любом случае обязательно повторно отправляет компонент, и все, что делает обратный вызов, — это ставит в очередь обновление состояния.

Может наблюдаться небольшое (очень незначительное) улучшение использования памяти при использовании одной объявленной, запоминаемой функции в течение всего срока службы компонента.

Если обратный вызов использовался в useEffect соединении, он может быть предоставлен в качестве стабильной ссылки и удален из массивов зависимостей, но обычно здесь вы просто перемещаете функцию в обратный вызов эффекта. Это не соответствует варианту использования, о котором вы спрашиваете, но это допустимый вариант использования, который не передает обратные вызовы детям.

Комментарии:

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

2. @AntonioPantano Ах, вы знаете, вы правы. В этом случае все равно никакой пользы. Спасибо, я обновлю.