getInitialProps
выполняется только один раз , либо на стороне сервера (при первой загрузке страницы сайта), либо на стороне клиента (при переходе на другую страницу с использованием Link
).
Вот изменения, которые вы должны сделать:
- Заменить
.on('value', ..)
на .once('value', ..)
в getInitialProps
. - Добавить
.on('value', ..)
в componentDidMount
, чтобы ваш компонент оставался обновленным - Добавьте
off()
в componentWillUnmount
, чтобы остановить прослушивание при размонтировании компонента.
Редактировать:
getInitialProps
инициализирует props
, тогда как в componentDidMount
будет установлен state
.Эту проблему можно решить, добавив конструктор, который будет инициализировать состояние из реквизита, а затем вы сможете только прочитать state
из рендера.
Это , обычно считается плохой практикой ,потому что теперь существует более одного источника правды, и неясно, что делать, когда меняются и состояние, и реквизиты, но в этом конкретном случае я думаю, что это нормально, потому что getInitialProps
будет запускаться только один раз, и если изменение страницы приведет к изменению компонентабыть отключенным.
Альтернативой является полное пропускание getInitialProps
, особенно если единственная причина сохранить его - сократить время первого значимого отображения, поскольку это, вероятно, незаметно для конечного пользователя.Обычно не стоит проводить микрооптимизацию, которая усложняет код.