答案是否定的,但请阅读有关如何应对的想法。
如果 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()
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
因此,您的问题的答案是,不,您的 DOM 元素在 componentWillMount() 中尚不存在,并且父元素在初始渲染时也不存在。您必须等到调用componentDidMount() 才能找出任何组件的尺寸。
但请注意react-dimensions 使用的技巧。也许这会给你一些想法如何构建你的代码。
在其render() 方法react-dimensions 可能不会渲染封闭的组件!在初始渲染时,它只渲染包含的
。只有在它的
componentDidMount() 被调用并且它发现了父级的尺寸之后,
只有这样才会渲染封闭的组件,
现在提供父级的尺寸。
所以另一个答案是在您知道父组件的尺寸之前不要渲染组件的内容。使用react-dimensions 使这很容易,因为在知道尺寸之前您甚至不会被渲染。但是你也可以做同样的事情,在你的componentDidMount() 中获取引用并获取尺寸,然后简单地将if(){} 放在渲染组件的真实内容周围,直到你知道尺寸. (你至少需要一个外部
来获得你自己的 ref)
【讨论】:
-
谢谢,是的,这也是我通过阅读 react-dimensions 代码得到的。我想也许根元素的父元素(未在反应中呈现)在 componentWillMount 之前可用,并且正如您明确回答的那样,它不可用。感谢您提供详细信息。