У меня есть специальный хук, который проверяет ширину окна для условного рендеринга некоторых элементов пользовательского интерфейса. Он работает нормально во время разработки, но не работает в сборке Gatsby.
Вот код для моего хука:
export const useViewport = () => {
const [width, setWidth] = React.useState(window.innerWidth);
React.useEffect(() => {
const handleWindowResize = () => setWidth(window.innerWidth);
window.addEventListener("resize", handleWindowResize);
return () => window.removeEventListener("resize", handleWindowResize);
}, []);
// Return the width so we can use it in our components
return { width };
}
Затем в моем компоненте я использую его так:
const { width } = useViewport();
const breakpoint = 767
/** in JSX **/
{
width > breakpoint ? <Menu {...props} /> : <Drawer {...props} />
}
Согласно Гэтсби docs window
недоступен в процессе сборки. Я пробовал использовать условие if (typeof window !== 'undefined')
для хука, но получаю следующую ошибку:
Cannot destructure property 'width' of 'Object(...)(. ..)' as it is undefined
Я также пытался обернуть const { width } = useViewport()
в React.useEffect
хук, но потом получаю ошибка, что width
в моем JSX не определено.
Как я могу исправить эту проблему?