Проблема здесь в том, что код сначала запускается на стороне сервера с помощью Next. js. Поскольку process.browser возвращает false на стороне сервера, ваша ловушка logi c никогда не регистрируется. Только 0 возвращается. Так как никакой ловушки не было зарегистрировано, и никакое событие не было установлено, изменение размера окна не вызовет повторную визуализацию.
Вам необходимо использовать componentDidMount () или useEffect.
Здесь пример для вашего случая, который будет работать.
const useWidth = () => {
const [width, setWidth] = useState(0); // default width, detect on server.
const handleResize = () => setWidth(window.innerWidth);
useEffect(() => {
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, [handleResize]);
return width;
};
С другой стороны, если вы хотите убедиться, что ваше начальное состояние соответствует состоянию окна браузера, вы можете динамически загружать свой компонент только на стороне клиента. .
import dynamic from 'next/dynamic'
const Login = dynamic(
() => import('./pathToLogin/Login'),
{ ssr: false },
)
и в вашем компоненте, где используется Login.
const TopLevelComponent = () => {
<Login {...props} />
}
, а затем вы можете свободно использовать объект окна в вашем компоненте Login.
const useWidth = () => {
// Use window object freely
const [width, setWidth] = useState(window.innerWidth); // default width, detect on server.
См. это , если все еще есть путаница.