我无法在React + Redux应用程序中使用mapDispatchToProps

时间:2018-08-07 09:13:52

标签: javascript reactjs react-native redux

在我的React + Redux应用程序中,我试图使用 mapDispatchToProps 实用程序,但是每当我将其放入connect(mapStateToProps, mapDispatchToProps)内时,它都会给我一个错误,提示Uncaught TypeError: dispatch is not a function at new ReduxApp (ReduxApp.js:42)

这可能是什么问题? PS:下面是文件

ReduxApp.js

 import React from 'react';
 import { Router, Route } from 'react-router-dom';
 import { connect } from 'react-redux';

 import { history } from './_helpers';
 import { alertActions } from './_actions'

 class ReduxApp extends React.Component {

  constructor(props) {
      super(props);

      this.handleChange = this.handleChange.bind(this);
      const { dispatch } = this.props;

      dispatch(alertActions.success("hello world"));
  }

  handleChange(){

      this.props.dispatch(alertActions.clear());
  }

  render(){
     const { alert } = this.props;
     return(

      <div>

         <h1>{alert.message}</h1>
         <button onClick={this.handleChange}>clear</button> {/* this is working since this function is declared outside the mapDispatchToProps. */}
         <button onClick={this.props.handleClick}>clear</button>

      </div>

     );

   }

 }

 const mapStateToProps = (state) => ({ 
   alert : state.alert
 });

 const mapDispatchToProps = (dispatch) => ({
   handleClick: () => dispatch(alertActions.clear())
 });

 const connectedApp = connect(mapStateToProps, mapDispatchToProps)(ReduxApp); // when I add mapDispatchToProps in the connect(), I get thhe issue.
 export { connectedApp as ReduxApp }

2 个答案:

答案 0 :(得分:3)

您首先需要通过dispatch,因为使用mapDispatchToProps时不可用(请参阅@gaeron Redux的创建者的回答:https://github.com/reduxjs/react-redux/issues/255

const mapDispatchToProps = dispatch => ({
  handleClick: () => alertActions.clear(dispatch),
  dispatch,
});

dispatch的引用可用之后,更新您的actionCreator以调度该操作:

alert.clear = dispatch => {
  // your logic
  dispatch(ALERT_CLEAR_ACTION) // or whatever you named your action
}

在您的组件中:

handleChange = () => this.props.handleClick();

答案 1 :(得分:2)

从React Redux Official Documentation

为什么我的连接组件中没有this.props.dispatch?

connect()函数采用两个主要参数,两者均为可选。第一个mapStateToProps是您提供的功能,用于在存储发生更改时从存储中提取数据,并将这些值作为prop传递给组件。第二个mapDispatchToProps是您提供的利用商店的分派功能的功能,通常是通过创建动作创建者的预绑定版本,这些动作创建者会在调用它们后立即自动分派他们的动作。

如果调用mapDispatchToProps时没有提供自己的connect()函数,React Redux将提供一个默认版本,该版本仅将props返回派发函数。这意味着,如果您确实提供了自己的功能,则不会自动提供dispatch。如果仍然希望将它作为道具使用,则需要在mapDispatchToProps实现中自己将其显式返回。

dispatch实现中返回mapDispatchToProps后,问题得到解决

 const mapDispatchToProps = (dispatch) => ({
         handleClick: () => dispatch(alertActions.clear()),
         dispatch, //returning dispatch solves the issue
 });

注意:如果我们使用PropTypes,则无需重新调整mapDispatchToProps