Подтвердить что ты не робот

Ошибка `window not defined` в Node.js

Я знаю, что window не существует в Node.js, но я использую React и тот же код как на клиенте, так и на сервере. Любой метод, который я использую для проверки существования window, меняет:

Неподготовлено ReferenceError: окно не определено

Как мне обойти тот факт, что я не могу сделать window && window.scroll(0, 0)?

4b9b3361

Ответ 1

Sawtaytoes получил это. Я бы запустил любой код, который у вас есть в componentDidMount(), и окружает его с помощью:

if (typeof(window) !== 'undefined') {
  // code here
}

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

if (typeof(window) !== 'undefined') {
    var timer = setTimeout(function() {
        // code here
    }, 200);
}

Я бы посоветовал не устанавливать состояние в setTimeout.

Ответ 2

Это позволит решить эту проблему:

typeof(window) === 'undefined'

Даже если переменная не определена, вы можете использовать typeof() для ее проверки.

Ответ 3

Этот тип кода не должен быть запущен на сервере, он должен находиться внутри некоторого componentDidMount (см. документ), который вызывает только клиентскую сторону. Это связано с тем, что не имеет смысла прокручивать сторону окна сервера.

Однако, если вам нужно ссылаться на окно в части вашего кода, который действительно запускает как клиент, так и сервер, вместо этого используйте global (который представляет глобальную область действия - например, window на клиенте).

Ответ 4

<Router onUpdate={() => window.scrollTo(0, 0)} history= {browserHistory}>

если вам нужно открыть новую страницу поверх приложения React JS, используйте этот код в файле router.js

Ответ 5

Это немного старше, но для классов компонентов реагирования в стиле ES6 вы можете использовать этот декоратор класса, который я создал как решение для определения компонентов, которые должны отображаться только на стороне клиента. Мне это нравится лучше, чем вскрытие оконных проверок везде.

import { clientOnly } from 'client-component';

@clientOnly
class ComponentThatAccessesWindowThatIsNotSafeForServerRendering extends Component {
    render() {
        const currentLocation = window.location;
        return (
            <div>{currentLocation}</div>
        )
    };
}

https://github.com/peterlazzarino/client-component