You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Hooks中无需useRef使用ref的相关技术疑问

React DOM节点测量相关疑问解答

先看文档中的示例代码:

function MeasureExample() {
  const [height, setHeight] = useState(0);

  const measuredRef = useCallback(node => {
    if (node !== null) {
      setHeight(node.getBoundingClientRect().height);
    }
  }, []);

  return (
    <>
      <h1 ref={measuredRef}>Hello, world</h1>
      <h2>The above header is {Math.round(height)}px tall</h2>
    </>
  );
}

疑问1:为何无需使用useRef Hook就能获取DOM节点的引用?不是说获取DOM节点实例需要使用useRef吗?

React的ref有两种形式:对象式ref(即你熟悉的useRef()创建的)和函数式ref。函数式ref是直接把一个函数传给ref属性,React会在组件挂载时把DOM节点作为参数传给这个函数,卸载时传null。所以不用useRef也能拿到DOM节点,只是两种不同的ref用法而已。

疑问2:示例中作为函数的ref是否应该命名为handleMeasureRef?

命名完全是个人或团队的规范问题,没有强制要求。measuredRef直接体现了这个ref的作用是测量节点,handleMeasureRef也没问题,只要命名清晰、符合团队约定就行。

疑问3:文档中提到“我们在这个示例中不选择useRef是因为对象ref不会通知我们当前引用值的变化”,为何对象ref无法通知变化?是否因为它不会触发重渲染?

对的,对象式ref是一个可变的容器,它的current属性会在DOM节点挂载后被赋值,但这个赋值过程是静默的——React不会在current变化时通知你,也不会触发组件重渲染。所以如果用对象式ref,你没法自动知道节点什么时候挂载/更新,也就没法及时获取最新的尺寸。

疑问4:是否意味着不使用useRef的ref就能通知引用变化?

准确说,函数式ref会在引用变化时(比如DOM节点挂载、卸载、或者ref指向改变时)被React主动调用,相当于给你一个“通知”的时机。而对象式ref没有这个通知机制,你只能自己手动去检查current的值有没有变化,但没法自动触发逻辑。

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:25:06