Как я могу получить высоту элемента после того, как React отобразит этот элемент?
HTML
<div id="container">
<!-- This element's contents will be replaced with your component. -->
<p>
jnknwqkjnkj<br>
jhiwhiw (this is 36px height)
</p>
</div>
ReactJS
var DivSize = React.createClass({
render: function() {
let elHeight = document.getElementById('container').clientHeight
return <div className="test">Size: <b>{elHeight}px</b> but it should be 18px after the render</div>;
}
});
ReactDOM.render(
<DivSize />,
document.getElementById('container')
);
РЕЗУЛЬТАТ
Size: 36px but it should be 18px after the render
Он вычисляет высоту контейнера до рендеринга (36 пикселей). Я хочу получить высоту после рендера. В этом случае правильный результат должен быть 18 пикселей. jsfiddle
javascript
reactjs
faia20
источник
источник
setState
для присвоения значения высоты переменной состояния.Ответы:
См. Эту скрипку (на самом деле обновил ваш)
Вам нужно подключиться к тому,
componentDidMount
что выполняется после метода рендеринга. Здесь вы получаете фактическую высоту элемента.источник
Ниже приведен обновленный пример ES6 с исх .
Помните, что мы должны использовать компонент класса React, так как нам нужен доступ к методу жизненного цикла,
componentDidMount()
потому что мы можем определить высоту элемента только после того, как он будет отрисован в DOM.Вы можете найти работающий пример здесь: https://codepen.io/bassgang/pen/povzjKw
источник
<div ref={ divElement => this.divElement = divElement}>{children}</div>
выдает «[eslint] Стрелочная функция не должна возвращать присвоение. (No-return-assign)» иthis.setState({ height });
выдает «[eslint] Не используйте setState в componentDidMount (response / no- did-mount-set-state) ". У кого-нибудь есть решение, соответствующее руководству по стилю?ref={ divElement => {this.divElement = divElement}}
componentDidUpdate
.Для тех, кто заинтересован в использовании
react hooks
, это может помочь вам начать работу.источник
useLayoutEffect
вместоuseEffect
? Документы, кажется, указывают, что мы должны. См. Раздел «совет» здесь: reactjs.org/docs/hooks-effect.html#detailed-explanation (2) В тех случаях, когда нам просто нужна ссылка на дочерний элемент, следует ли использоватьuseRef
вместоcreateRef
? Документы, похоже, указывают на то, чтоuseRef
он более подходит для этого варианта использования. См .: responsejs.org/docs/hooks-reference.html#userefuseLayoutEffect
прочитав другие комментарии здесь. Кажется, работает хорошо. :)useEffect(() => setDimensions({width: popup.current.clientWidth, height: popup.current.clientHeight}))
, и моя IDE (WebStorm) предложила мне следующее: ESLint: React Hook useEffect содержит вызов setDimensions. Без списка зависимостей это может привести к бесконечной цепочке обновлений. Чтобы исправить это, передайте [] в качестве второго аргумента хука useEffect. (react-hooks / excustive-deps) , так что передайте в[]
качестве второго аргумента вашuseEffect
Вы также можете использовать refs для элемента вместо использования
document.getElementById
, это просто немного более надежная вещь.источник
angularJs
иreact
при переходе с одного на другой? Бывают случаи, когда прямая манипуляция с DOM действительно необходимаМой ответ 2020 (или 2019)
позвольте использовать ваше воображение для того, чего здесь не хватает (WidgetHead),
reactstrap
это то , что вы можете найти на npm: replaceinnerRef
withref
для устаревшего элемента dom (скажем, a<div>
).useEffect или useLayoutEffect
Последний считается синхронным для изменений
useLayoutEffect
(илиuseEffect
) второй аргументВторой аргумент - это массив, и он проверяется перед выполнением функции в первом аргументе.
я использовал
поскольку перед рендерингомself.current имеет значение null, и это хорошо, чтобы не проверять, второй параметр в конце
myself.current.clientHeight
- это то, что я хочу проверить на предмет изменений.что я здесь решаю (или пытаюсь решить)
Я решаю здесь проблему виджетов в сетке, которые изменяют свою высоту по собственному желанию, и система сетки должна быть достаточно эластичной, чтобы реагировать ( https://github.com/STRML/react-grid-layout ).
источник
useLayoutEffect
фактическим div для привязки ссылки.document.getElementById(...)
Лучшее (актуальное) решение вместо использования - использовать перехватчик React useRef, который хранит ссылку на компонент / элемент, в сочетании с перехватчиком useEffect , который срабатывает при рендеринге компонента.источник
Использование с крючками:
Этот ответ будет полезен, если размер вашего контента изменится после загрузки.
onreadystatechange : возникает при изменении состояния загрузки данных, принадлежащих элементу или документу HTML. Событие onreadystatechange запускается в HTML-документе при изменении состояния загрузки содержимого страницы.
Я пытался работать со встроенным видеоплеером YouTube, размеры которого могут измениться после загрузки.
источник
Я нашел полезный пакет npm https://www.npmjs.com/package/element-resize-detector
Оптимизированный кросс-браузерный слушатель изменения размера элементов.
Можно использовать с компонентом React или функциональным компонентом (особенно полезно для перехватчиков реакции)
источник
Вот еще одно, если вам нужно событие изменения размера окна:
кодовая ручка
источник
Альтернативное решение, если вы хотите получить размер элемента React синхронно без необходимости визуализации элемента, вы можете использовать ReactDOMServer и DOMParser .
Я использую эту функцию, чтобы получить высоту средства визуализации элемента моего списка при использовании реактивного окна ( реактивно-виртуализированного ) вместо того, чтобы жестко кодировать требуемую
itemSize
опору для FixedSizeList .utilities.js:
источник