В React.js неверный clientHeight получил при использовании flexGrow

Я создавал контейнер изображений, который может автоматически соответствовать каждой строке и сохранять коэффициент масштабирования, поэтому я использую flex, после установки ширины и flexGrow все выглядит нормально

Демо Ссылка

Но когда я пытаюсь получить размер дочернего элемента, результат clientHeight неверен.

Вы можете увидеть результат работы браузера.

(и демонстрация codeandbox не ведет себя так же в chrome при использовании локальной сборки: после перезагрузки значение внезапно окажется близко к правильному значению в Codeandbox.)

Итак, что происходит? Я что-то упустил или код неправильный?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
1 396
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От MSDN - Element.clientHeight

The Element.clientHeight read-only property is zero for elements with no CSS or inline layout boxes, otherwise it's the inner height of an element in pixels, including padding but not the horizontal scrollbar height, border, or margin.

Акцент мой.

Вывод вашей песочницы кода для меня:

1 
True Height 
233.8
Wrong Height 
239
clientWidth 
167

Если вас интересует разница в десятичной запятой, ссылка также отмечает:

Note: This property will round the value to an integer. If you need a fractional value, use element.getBoundingClientRect().


На самом деле проблема здесь иная, чем я думал изначально. Рабочая вилка Codepen

Первоначально проблема с вашим кодом заключалась в том, что вы пытались проверить высоту до того, как компонент будет фактически отрисован в DOM.

Поскольку высота div зависит от размера окна - при изменении размера окна вам нужно будет пересчитать его.

Для этого я добавил слушателя изменения размера окна:

  componentDidMount() {
    window.addEventListener("resize", this.updateHeightHandler);
  }

Я также добавил обработчик, вызываемый каждый раз при изменении размера окна, который устанавливает состояние при изменении размера окна, а затем записывает вывод в консоль:

updateHeightHandler = () => {
  console.info("UPDATE HEIGHT HANDLER");
  this.setState({
    div1Height: this.div1.clientHeight,
    div2Height: this.div2.clientHeight,
    div3Height: this.div3.clientHeight
  });
  this.logHeightHandler();
};

Сначала я пытался заставить это работать без обработчика изменения размера окна (с логикой setstate непосредственно в componentDidMount), и это не сработало. Изображения не были загружены во время запуска componentDidMount (), что привело к неверным результатам. Как только я понял, в чем проблема, решение проверить ее при изменении размера стало для меня разумным, но я открыт для альтернативных предложений о том, как это можно сделать!


Если требуется получить высоту сразу после загрузки изображений, а не после изменения размера окна, вы можете добавить событие onLoad к элементу <img>, например:

onLoad = {this.onImageLoadHandler}

Оттуда вы просто установите состояние для div, соответствующее загруженному изображению.

Если вам нужны дополнительные разъяснения о том, как это реализовать, дайте мне знать, и я смогу обновить код.

Я не знаю, что здесь происходит, но мой браузер выводит `Wrong Height 18`

Joe Davidson 26.05.2018 22:51

вау, вот и все, я просто забыл onLoad. Вы мне очень помогли!

Joe Davidson 27.05.2018 00:49

Другие вопросы по теме