【问题标题】:React Router v4 with Redux - dispatch is not passed使用 Redux 的 React Router v4 - 调度未通过
【发布时间】:2017-12-05 07:43:58
【问题描述】:

所以,我一直在尝试将我的应用程序切换到 React Router v4(api 发生了很大变化),这就是我到达的地方:

路由器设置

const createStoreWithMiddleware = applyMiddleware(
   thunkMiddleware,
   createLogger
)(createStore);
const store = createStoreWithMiddleware(rootReducer);

const RouterLayout = () => (
    <Provider store={store}>
        <App>
            <Switch>
                <Route component={Login} path="/login" />
                <Route component={AccountDetails} path="/account/:id" />
            </Switch>
        </App>
    </Provider>
);

const routes = (
    <HashRouter>
        <RouterLayout />
    </HashRouter>
);

ReactDOM.render(routes, document.getElementById("app-container"));

现在我的问题是,由于某种原因,我无法将 redux 连接到我的组件:

export class Login extends React.Component<any, any> {
    componentDidMount() {
        console.log(this.props);
        // this.props.dispatch is undefined 
        // I'm getting however router props: 
        // match: Object, location: Object, history: Object, staticContext: undefined)
    }

    render() {
        return (
            <div>
                This is the Login Component
            </div>
        );
    }
}

export default connect((state: AppState): any => {
    return state;
})(Login);

有趣的是App 组件可以毫无问题地连接并访问dispatch,但Login 没有它。我很确定我做错了什么,但我不知道到底是什么。

【问题讨论】:

  • 您在 App 中的调度情况如何?是通过 react-redux 连接的吗?
  • @D-reaper 是的,与我在Login 中获取dispatch 的方式完全相同(相同的代码)。
  • 您没有使用 mapDispatchToProps 函数(connect 中的第二个参数),您是如何获得调度的?
  • @D-reaper 不知道该告诉你什么,但它是相同的代码,我将尝试清理 App 中的代码(仅保留相关位)并发布它为了清楚起见。但是它是相同的代码,我没有将第二个参数传递给connect

标签: javascript reactjs typescript react-router


【解决方案1】:

如果this.props.dispatch 不可用,那么很可能您的组件没有连接到 redux。

我认为这里的问题是您将 Login 导出两次,一次作为 react 组件,另一次作为连接到 redux 存储的组件(默认导出)。在RouterLayout所在的文件中,你可能用大括号导入login,因此这里的Login组件就是没有连接到redux的组件。

此外,您的 createStore 看起来不正确。它应该如下所示:

const createStoreWithMiddleware = (reducer) => {
  const middlewares = applyMiddleware(
     thunkMiddleware,
     createLogger
  );

  return createStore(
    reducer,
    middlewares
  );
}

const store = createStoreWithMiddleware(rootReducer);

【讨论】:

  • 听起来很可能。过去,默认出口也同样困扰着我。来自react-redux docs:> 如果您不提供自己的 mapDispatchToProps 函数或充满动作创建者的对象,则默认的 mapDispatchToProps 实现只是将调度注入组件的道具。
  • 谢谢 (+1),事实证明你是对的,没有注意到错误的导入。无论如何将其更改为default 导出与typescript 定义发生冲突,并且应用程序无法编译,无论如何您可以给我一个如何正确完成的示例(或链接)?
  • 澄清一下,这是我在更改后得到的:Type 'ComponentClass&lt;{}&gt;' is not assignable to type 'ComponentClass&lt;RouteComponentProps&lt;any&gt;&gt;
  • 无论如何,改变了一切(在这里和那里抛出了几个any,修复了import),让它编译 - 仍然看不到dispatch,想法?
  • 所以您使用了export default connect ... 并删除了import class Login ... 中的导入,对吗?如果是这样,那么 dispatch 应该是可用的,除非 store 没有正确声明。我建议您也像我在更新的答案中所说的那样修复商店
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 2018-12-09
  • 2019-08-24
  • 1970-01-01
  • 2018-03-31
  • 2017-08-20
  • 2018-01-17
  • 2021-01-28
相关资源
最近更新 更多