Ответ 1
через некоторое время я нашел разумное решение:
- в реакции, после каждого
this.setState()
Я сохраняю состояние, синхронизированное с историей, используяwindow.history.replaceState({ key: history.location.key, state: this.state})
- когда компонент "страница" монтируется или обновляется (
willMount
иwillReceiveProps
), я проверяю состояние вprops.params.location.state
: если он есть, я его восстанавливаю; если нет, я создаю новое новое состояние. - при навигации по той же странице я не использую маршруты, я просто использую
this.setState
иwindow.history.pushState
- при навигации вне страницы я просто использую маршруты и избегаю пропускать что-либо в состоянии
Это решение, похоже, работает хорошо, единственными незначительными минусами являются:
- состояние должно быть сериализуемым
-
this.setState
- этоthis.setState
, потому что она асинхронна, вы не можете использоватьthis.state
после нее, если только вы не обманываете. - начальное пустое состояние должно быть предоставлено функцией, которая будет использоваться во время фазы восстановления или инициализации, она не может просто оставаться в
constructor()
Component
- в Firefox, автоматическое восстановление прокрутки после того, как кнопка "Назад" работает случайным образом, не знаю почему, но Chrome и Edge в порядке.
В целом я написал Component
PageComponent
который расширяет Component
который выполняет все PageComponent
init/PageComponent
; он также переопределяет this.setState
чтобы он автоматически синхронизировался с историей и избегал асинхронных раздражений.