假设一个组件在呈现之前需要知道它的大小.用我的知识,我可以这样做:呈现组件,在componentDidMount获得DOM节点和提取大小出来,与大小更新状态,然后再次渲染(让我们不要使之与事件侦听器,我连接到窗口的复杂调整大小事件,让我们假设窗口不调整),它的工作原理,但似乎脏,第一渲染仅仅是资源的浪费,我想知道元素的大小(或容器),它的渲染之前,我知道大多数的时间元素本身声明了大小,但在某些情况下,父元素声明了大小,我的情况就是其中一种情况.总而言之,有没有办法在呈现之前访问react组件的parent元素(在componentWillMount中)?
PS我知道反应强度,但我想要一个更简单的解决方案,不需要外部插件.我只想知道是否可以在reactWillMount中访问parentWillMount中的父节点.
She*_*nme 24
答案是否定的,但请阅读有关如何应对的想法.
如果DOM元素不存在,则无法找到其尺寸.在完成每个组件的第一次渲染之前,DOM元素不存在.在componentDidMount()
调用组件之前,您无法了解有关此DOM元素或其父元素的任何信息.
还要注意组件的呈现顺序.在初始渲染树/组件链时,componentDidMount()
将在父级之前调用子级componentDidMount()
!以下是嵌套菜单树中日志的快照:
(MenuItemSubmenu:handleRefSet) appMenu:2.2.5.4 handleRefSet()
(MenuItemSubmenu:componentDidMount) appMenu:2.2.5.4 componentDidMount()
(MenuPane:handleRefSet) appMenu:2.2.5 handleRefSet()
(MenuPane:componentDidMount) appMenu:2.2.5 componentDidMount()
(MenuItemSubmenu:handleRefSet) appMenu:2.2.5 handleRefSet()
(MenuItemSubmenu:componentDidMount) appMenu:2.2.5 componentDidMount()
(MenuPane:handleRefSet) appMenu:2.2 handleRefSet()
(MenuPane:componentDidMount) appMenu:2.2 componentDidMount()
(MenuItemSubmenu:handleRefSet) appMenu:2.2 handleRefSet()
(MenuItemSubmenu:componentDidMount) appMenu:2.2 componentDidMount()
Run Code Online (Sandbox Code Playgroud)
componentDidMount()
对于子项2.2.5.4在其之前为其父项2.2.5调用.从中可以看出,在完成对子进程的所有处理之前,父组件无法知道自己的DOM元素.嗯,哇!
但是,在追问您的问题时,我在组件的componentDidMount()
方法中添加了一些日志记录.我记录this.refToOurDom.parentElement
并发现它已定义并且看起来很好!
(MenuItemSubmenu:handleRefSet) appMenu:2.2.5.4 parent dims: height 76 width 127
Run Code Online (Sandbox Code Playgroud)
所以你的问题的答案是,不,你的DOM元素还不存在,componentWillMount()
并且父元素在初始渲染时也不存在.componentDidMount()
在找到任何组件的尺寸之前,必须等到被调用.
但请注意react-dimensions
使用的技巧.也许这将为您提供如何构建代码的想法.
在其render()
方法中react-dimensions
可能无法渲染封闭的组件!在初始渲染时,它只渲染包含<div>.只有在componentDidMount()
调用它并找到父级的尺寸之后,才会渲染所包含的组件,并且现在提供父级的尺寸.
所以另一个答案就是在知道父级的维度之前不要渲染组件的内容.使用react-dimensions
变得容易,因为在尺寸已知之前甚至不会渲染.但你也可以做同样的事情,在你的componentDidMount()
抓取尺寸中获取参考,然后简单地if(){}
渲染一下你的组件的真实内容,直到你知道尺寸.(你至少需要一个外部的<div>来获得你自己的参考)
归档时间: |
|
查看次数: |
13232 次 |
最近记录: |