Ответ 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 чтобы он автоматически синхронизировался с историей и избегал асинхронных раздражений.