Компоненты Marko предназначены для визуализации как на сервере, так и в браузере. Из-за этого доступ к window
/ document
в onCreate
(и onRender
и onInput
) приведет к ошибкам на сервере, где эти значения не существуют.
Кроме того, вы не можете измерить DOM-узлы, пока они не будут смонтированы в документе.
По этим причинам onMount
, вероятно, является лучшим местом для применения этой логики. onMount
вызывается только в браузере и после того, как узлы существуют в DOM.
Это, однако, означает, что ваш начальный рендер будет не совсем корректным. Вам, вероятно, нужно будет установить значения по умолчанию state.winHeight
и state.elemHeight
. После первоначального рендеринга будут выполнены измерения, и ваш компонент обновится, чтобы отразить новые значения.
class {
onCreate() {
this.state = { winHeight:0, elemHeight:0 }
}
onMount() {
this.state.elemHeight = this.getEl("measure").clientHeight;
this.state.winHeight = window.innerHeight;
}
}
<div key="measure">
<p>Element ${state.elemHeight}!</p>
<p>Window ${state.winHeight}!</p>
</div>
В зависимости от того, для чего вы используете эти значения, это может быть приемлемым и в основном незаметным для ваших пользователей. Однако, если обновление этих значений приводит к тому, что что-то заметно перескочит, вы можете рассмотреть рендеринг заполнителя, когда эти значения недоступны.