У меня есть приложение React (16.8.6), написанное на TypeScript, которое использует React Router (5.0.1) и MobX (5.9.4). Навигация работает нормально, и данные загружаются тогда, когда это необходимо, однако, когда я нажимаю в браузере кнопку «Назад», URL-адрес изменяется, но состояние не обновляется, и страница не перерисовывается. Я читал бесконечное количество статей об этой проблеме и об исправлении withRouter, которое я пробовал, но это не имеет значения.
Типичный вариант использования - это переход к странице сводки, выбор различных вещей, которые вызывают загрузку новых данных и добавление новых состояний истории, а затем возвращение на пару шагов назад к тому месту, где вы начали. Большинство нажатий на историю происходит в компоненте сводки, который обрабатывает несколько маршрутов. Я заметил, что при возврате со страницы сводки на домашнюю страницу повторный рендеринг происходит должным образом.
Мой index.tsx
import { Provider } from 'mobx-react'
import * as React from 'react'
import * as ReactDOM from 'react-dom'
import App from './App'
import * as serviceWorker from './serviceWorker'
import * as Utils from './utils/Utils'
const rootStore = Utils.createStores()
ReactDOM.render(
<Provider {...rootStore }>
<App />
</Provider>,
document.getElementById('root') as HTMLElement
)
serviceWorker.unregister()
Мой app.tsx
import * as React from 'react'
import { inject, observer } from 'mobx-react'
import { Route, Router, Switch } from 'react-router'
import Home from './pages/Home/Home'
import PackageSummary from './pages/PackageSummary/PackageSummary'
import ErrorPage from './pages/ErrorPage/ErrorPage'
import { STORE_ROUTER } from './constants/Constants'
import { RouterStore } from './stores/RouterStore'
@inject(STORE_ROUTER)
@observer
class App extends React.Component {
private routerStore = this.props[STORE_ROUTER] as RouterStore
public render() {
return (
<Router history={this.routerStore.history}>
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/summary/:packageId" component={PackageSummary} />
<Route exact path="/summary/:packageId/:menuName" component={PackageSummary} />
<Route exact path="/summary/:packageId/:menuName/:appName" component={PackageSummary} />
<Route component={ErrorPage} />
</Switch>
</Router>
)
}
}
export default App
Мой магазин роутеров
import { RouterStore as BaseRouterStore, syncHistoryWithStore } from 'mobx-react-router'
import { createBrowserHistory } from 'history'
export class RouterStore extends BaseRouterStore {
constructor() {
super()
this.history = syncHistoryWithStore(createBrowserHistory(), this)
}
}
Как я создаю магазины MobX
export const createStores = () => {
const routerStore = new RouterStore()
const packageListStore = new PackageListStore()
const packageSummaryStore = new PackageSummaryStore()
const packageUploadStore = new PackageUploadStore()
return {
[STORE_ROUTER]: routerStore,
[STORE_SUPPORT_PACKAGE_LIST]: packageListStore,
[STORE_SUPPORT_PACKAGE_SUMMARY]: packageSummaryStore,
[STORE_SUPPORT_PACKAGE_UPLOAD]: packageUploadStore
}
}
Итак, мои вопросы:
- Как я могу заставить страницу загружать правильные данные, когда пользователь переходит назад / вперед через браузер?
- Если решение состоит в том, чтобы заставить MobX отслеживать изменения местоположения, как мне это сделать?