如何从 react-router onEnter 挂钩连接到 redux store?

How to connect to redux store from react-router onEnter hook?

我想在路由加载时使用 react-router 的 onEnter 钩子来检查我的 redux 存储中的变量。

根据文档,onEnter:

...receives the next router state as its first argument. The replaceState function may be used to trigger a transition to a different URL.

没有通过商店。是否可以从此挂钩中连接到 redux 存储?我尝试了各种方法,但找不到实现此目标的方法。

我使用的版本:

"react-redux": "^4.0.0",
"react-router": "1.0.0-rc1",
"redux": "^3.0.0",

您可以创建文件 store.js 并导出最终存储(与传递给 redux 的相同)

例如

import configureStore from 'utils/configure-store.js';

const store = configureStore();
export default store;

然后导入到您的路由器文件并通过 store.getState()

读取状态

让你路由一个在参数中获取存储的函数

export default (store) => {
 return (
  <Route handler={App} path="/">
    <Route path="mypath" component={handler} onEnter={myHook(store)}>
  <Route>
 )
};

在你的转换挂钩中做同样的事情

export const myHook = (store) => {
  return (location, replaceWith) => {
    // Do something with your store
  }
};

然后假设您在同一个文件中创建商店和路由器

const router = (
            <Provider store={store}>
                <Router history={history}>
                    {routes(store)}
                </Router>
            </Provider>
        );

React Router 版本 4 migration documentation 建议使用组件生命周期方法来处理更改。

例如使用 componentWillMount 而不是 onEnter 或通过 componentWillReceiveProps 响应状态变化。

因此在您的组件中:

import { browserHistory } from 'react-router';

...

componentWillMount() {
  if (someConditionIsTrue) {
    browserHistory.push('/your/new/path');
  }
}

为了奖励积分,您可以将其写成 Higher Order Component,它只是包装您的原始组件。让需要相同行为的任何其他组件更容易共享此逻辑。