Два способа определения ссылок не эквивалентны.
Рассмотрим первый пример
const CompA = () => {
let _input;
return (
<input ref={el => _input = el} type="text" />
);
}
В этом примере всякий раз, когда CompA выполняет повторный рендеринг, создается новая переменная _input
, например, если у вас есть useEffect в CompA, которое предназначено для запуска при начальном рендеринге, и оно выполняет что-то с интервалом, используя эту ссылку переменная, это приведет к несоответствиям.
Теперь рассмотрим второй случай
const CompA = () => {
const _input = useRef(null);
return (
<input ref={_input} type="text" />
);
}
В этом случае, даже если переменная _input создается при каждом рендеринге, useRef
гарантирует, что он получит ту же ссылку, что и в первый раз, и не инициализирует ее снова. useRef
- это правильный способ определения ссылок для functional Components
. Для компонентов класса вы можете использовать createRef
или шаблон обратного вызова, который вы упомянули