react 生命周期函数 componentDidMount 为什么不能保证可以拿到真实的dom?

发布于 2022-09-11 21:08:28 字数 264 浏览 23 评论 0

问题:react 生命周期函数 componentDidMount 为什么不能保证可以拿到真实的dom?

示例代码:

componentDidMount(){
    console.log(this.test) //大概率会得到null
}

render(){
    return(
        <div ref={(test) => {this.test = test}}>123<div>
    )
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

土豪 2022-09-18 21:08:28

回答

React 保证在 componentDidMountcomponentDidUpdate 之前设置 refs,但仅仅是在确定子组件已经渲染后。

以下情况都有可能无法立即获取到 refs

1) 设置条件渲染

render() {
  if (this.state.isLoading) {
    return <h1>Loading</h1>;
  }

  return <div ref={this._setRef} />;
}

2)子组件包裹造成未渲染。

<MyComponent>
  <div ref={this.setRef} />
</MyComponent>

function MyComponent(props) {
  // 未渲染子组件
  return <h1>Oops, no refs for you today!</h1>;
}

3) 使用 ReactDOM.render 嵌套渲染

<MyModal>
    <div ref={this.setRef}></div>
</MyModal>

function MyModal() {
    componentDidUpdate() {
        ReactDOM.render(this.props.children, $dom)
    }
    render() {
        return null;
    }
}

// 这种情况可以使用 createPortal
render() {
    return ReactDOM.createPortal(this.props.children, $dom)
}

总结出来就一句话:设置 ref 的组件或者元素渲染之后才能获取到对应的 ref

旧夏天 2022-09-18 21:08:28

不是this.state.test么

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文