贝利信息

如何在 React 中安全访问 useRef 创建的 DOM 元素引用

日期:2026-01-10 00:00 / 作者:心靈之曲

在使用 `useref` 获取 dom 元素时,`ref.current` 在组件首次渲染或元素尚未挂载时为 `undefined`,直接访问其属性(如 `offsetwidth`)会抛出 typeerror;需通过可选链操作符或条件判断确保元素存在后再读取。

React 的 useRef 返回的对象在整个组件生命周期中保持不变,但其 .current 属性的值取决于 DOM 元素是否已实际挂载。在你的 Modal 场景中, 默认启用 mountOnEnter={true} 和 unmountOnExit={true},这意味着:当 visible 为 false 时,UserParamModalOverlay 并未渲染到 DOM 中,modalRef.current 自然为 null;而 useEffect 在组件首次挂载时立即执行(此时 visible 仍为 false),导致 modalRef.current 尚未被赋值,进而触发 Cannot read properties of undefined 错误。

✅ 正确做法是:始终校验 ref 是否已挂载。推荐使用可选链操作符(?.)配合空值合并(??)提供默认值,既简洁又健壮:

useEffect(() => {
  if (modalRef.current) {
    console.log("Modal width:", modalRef.current.offsetWidth);
    // ✅ 安全访问:此处 modalRef.current 已挂载
  }
}, [modalRef.current]); // 注意:依赖项应为 modalRef.current,而非 modalRef

⚠️ 关键注意事项:

总结:useRef 不是魔法,它只是容器;DOM 引用的安全访问永远建立在“存在性校验”之上。结合 onEntered 生命周期钩子 + ?. 可选链,即可稳健实现基于触发元素位置的 Modal 动态定位。