В моем веб-приложении есть верхняя панель навигации, высота которой может изменяться. Он закреплен в верхней части экрана, css position: fixed. Чтобы переместить содержимое страницы под ним, у меня есть разделитель div, который обновляет свою высоту, чтобы соответствовать высоте заголовка, и подталкивает все остальное вниз.
Я обновляю свое приложение, чтобы использовать перехватчики React. У меня есть крючок useLayoutEffect
, который проверяет высоту панели навигации и обновляет высоту прокладки, чтобы она соответствовала. Согласно документации React:
В отличие от componentDidMount или componentDidUpdate эффекты, запланированные с помощью useEffect, не блокируют обновление экрана браузером. Это делает ваше приложение более отзывчивым. Большинство эффектов не обязательно должно происходить синхронно. В редких случаях, когда они это делают (например, при измерении макета), существует отдельный хук useLayoutEffect с API, идентичным useEffect.
Кажется, я обнаружил, что ленивая загрузка React прерывается useLayoutEffect
. Вот CodeSandBox:
https://codesandbox.io/s/5kqxynp564
За навигационной панелью скрыт блок div, содержащий текст «ЕСЛИ ВЫ УВИДИТЕ, ЧТО ЭТО ИСПОЛЬЗОВАНИЕ РАБОТАЕТ». При использовании прямого импорта размер блока div над этим текстом устанавливается в соответствии с размером панели навигации, при этом текст перемещается вниз под панелью навигации, и текст становится видимым. Когда используется React.lazy, useLayoutEffect
(в AppBarHeader.js) не работает.
Ленивая загрузка происходит в App.js:
//LOADING <COUNTER/> THIS WAY WORKS
// import Counter from "./Counter";
//LAZY LOADING <COUNTER/> THIS WAY BREAKS useLayoutEffect
const CounterPromise = import("./Counter");
const Counter = React.lazy(() => CounterPromise);
Что я скучаю?