Ответ 1
Ответ - нет, но, пожалуйста, прочитайте идеи о том, как справиться.
Если элемент DOM не существует, вы не можете найти его размеры. Элемент DOM не существует до тех пор, пока не будет выполнен первый рендер для каждого компонента. Вы не можете ничего знать об этом элементе DOM или его родительском элементе, пока не будет вызван компонент componentDidMount()
.
Обратите внимание также на порядок отображения компонентов. При первоначальном рендеринге дерева/цепочки компонентов дочерний элемент 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
не может отображать прилагаемый компонент! При первоначальном рендеринге он отображает только содержащее <div> . Только после вызова componentDidMount()
и выяснения родительских измерений только тогда будет отображаться вложенный компонент и теперь, поставляя родительские размеры.
Таким образом, другой ответ просто не отображает содержимое вашего компонента, пока вы не узнаете размеры родителя. Использование react-dimensions
делает это легко, потому что вы даже не отображаются до тех пор, пока размеры не будут известны. Но вы также можете сделать то же самое, получить ссылку в своих componentDidMount()
и захватывающих измерениях и просто разместить if(){}
вокруг рендеринга реального содержимого вашего компонента, пока не узнаете размеры. (Вам понадобится хотя бы внешний <div> , чтобы получить свой собственный ref)