javascript - ReactJS 中 `useRef` 和 ref 变量的区别

标签 javascript reactjs react-hooks react-ref

我有这个

const CompA = () => {
  let _input;
  return (
    <input ref={el => _input = el} type="text" />
  );
}

和这个
const CompB = () => {
  const _input = useRef(null);
  return (
    <input ref={_input} type="text" />
  );
}

两个_inputinput 的 ref 对象标签,我找不到它们之间的区别。

我的问题是:两个 _input 有什么区别?其中_input更好?

最佳答案

refs 的两种定义方式是不等价的。

考虑第一个例子

const CompA = () => {
  let _input;
  return (
    <input ref={el => _input = el} type="text" />
  );
}

在此示例中,无论何时,CompA 都会重新渲染,作为新变量 _input被创建,例如,如果您在 CompA 中有一个 useEffect,它旨在在初始渲染上运行,并且它使用这个 ref 变量每隔一段时间执行一些东西,这将导致不一致。

现在考虑第二种情况
const CompA = () => {
  const _input = useRef(null);
  return (
    <input ref={_input} type="text" />
  );
}

在这种情况下,即使在每次渲染时都创建了 _input 变量,useRef确保它收到与第一次收到的引用相同的引用,并且不会再次对其进行初始化。 useRef是为 functional Components 定义引用的正确方法.对于类组件,您可以使用 createRef或者你提到的回调模式

关于javascript - ReactJS 中 `useRef` 和 ref 变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553236/

相关文章:

javascript - 在html中更新图像上的文本

reactjs - 是否可以在不使用 ref 的情况下调用 focus() 等 dom 元素方法? (无状态组件函数)

reactjs - 在渲染到屏幕之前对内存中加载的视频进行 react

javascript - chrome devtools 调试 react ,命中 "refresh"导致调试卡住

javascript - 将 Bitly API 限制为特定域

javascript - 为什么当语句为 true 时 JS 不会重定向网页?

javascript - 在我的 Express js 应用程序中使用 mysql 连接

javascript - React hooks + WebSockets 的正确使用方法

reactjs - 如何在另一个函数中使用 useEffect() 中声明的变量?

reactjs - 在页面之间路由时,Context.Provider 重新呈现为初始状态