React 重新学习前端技术

React 文档再学习 6 使用 Ref

2022-11-27  本文已影响0人  吴摩西

ref

访问子组件的 DOM

Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

function MyInput(props) {
  return <input {...props} />;
}
export default function MyForm() {
  const inputRef = useRef(null);
  return <MyInput ref={inputRef} />
}

直接访问其他组件的 DOM 被认为是脆弱的代码。可以通过 forwardRef 显示声明此组件暴露接口,允许外界组件访问内部的 DOM。

const MyInput = forwardRef((props, ref) => {
  return <input {...props} ref={ref} />;
});

实际的应用中,底层的组件设计系统,例如 input, button 等组件,暴露内部的 DOM ,方便外部访问。而较高层的组件,例如 form,列表,页面等,一般不暴露内部的 DOM 引用,以防止内部 DOM 结构变化导致接口不兼容。

React 挂载在 ref 的时机

在 React 中,所有的更新都分为两个阶段:

所以在 render 过程中,不建议访问 ref。如果 ref 指向 DOM,第一次 render 时,它是 null,后续更新时,由于 DOM 还没有更新,它指向的是尚未更新的 DOM。

React 在 commit 时设置 ref.current。在更新 DOM 以后,React 会立即把 ref.current 挂载在对应的 DOM 元素上。

使用 Ref 的最佳实践

ref 是所谓的应急门,应该在与 React 意外的系统交互时使用。在执行无破坏性的操作,例如聚焦、滚动页面时,没有任何问题。但是如果直接手动改变 DOM ,可能会跟 React 正在执行的变化冲突。

上一篇下一篇

猜你喜欢

热点阅读