ルーターv4と履歴v4.5.1に切り替え、履歴リスナーが機能しない
import createBrowserHistory from 'history/createBrowserHistory'
const history = createBrowserHistory()
history.listen((location, action) => {
console.log(action, location.pathname, location.state) // <=== Never happens
})
render(
<Provider store={store}>
<Router history={history}>
...
</Router>
</Provider>,
document.getElementById('root')
)
それが無視されている理由はありますか?
BrowserRouterを使用しているため(質問のコメントで言及されているように、インポートエイリアスルーターを使用)、渡した履歴プロップは関係ありません。代わりに 内部で新しいブラウザーを作成して割り当てますルーターへの履歴 。したがって、あなたが聞いてルーターで使用されている履歴インスタンスは同じではありません。そのため、リスナーは機能しません。
元のルーターをインポートします。
import { Router } from 'react-router-dom';
期待どおりに動作します。
問題は、独自の履歴オブジェクトを作成してルーターに渡すことです。ただし、React Router v4はすでにthis.propsを介してこのオブジェクトを提供しています。 (ルーターのインポートはこれとは関係ありません)
componentDidMount() {
this.props.history.listen((location, action) => console.log('History changed!', location, action));
}
ただし、以下のようにアプリをもう少し階層化して、このcomponentDidMountメソッドをMyApp.jsxに配置し、直接最上位レベルに配置する必要はありません。
<Provider store={store}>
<BrowserRouter>
<MyApp/>
</BrowserRouter>
</Provider>
(React Nativeを実行している場合は、BrowserRouterではなくNativeRouterを使用してください)