Хорошо, вот вот решение не очень грязное , которое я придумал.Вместо реализации наивного решения, т.е.условный хук:
const Layout = () => {
const [loading, setLoading] = useState()
if(typeof window !== 'undefined')
useLayoutEffect(() => {
document.body.style.overflowY = loading ? 'hidden' : 'visible'
}, [loading])
return ( ... )
}
export default Layout
, который кажется грязным, анти-паттерном, семантически неправильным и бесполезным во многих случаях (зачем проверять window
при каждом рендеринге?), я просто помещаю условие вне компонента:
const LayoutView = ({ loading, setLoading }) => ( ... )
const Layout = (typeof window === 'undefined') ? (
() => {
const [loading, setLoading] = useState()
return <LayoutView loading={loading} setLoading={setLoading}/>
}
): (
() => {
const [loading, setLoading] = useState()
useLayoutEffect(() => {
document.body.style.overflowY = loading ? 'hidden' : 'visible'
}, [loading])
return <LayoutView loading={loading} setLoading={setLoading}/>
}
)
export default Layout
Будьте осторожны, это работает только потому, что мой эффект макета не влияет на часть React DOM, что и было смыслом предупреждения.