This.props.dispatch不是函数 - React-Redux

ric*_*tor 30 javascript ecmascript-6 reactjs redux react-redux

我正试图从我的智能组件中发出一个动作.我已经尝试使用了mapDispatchToProps,this.props.dispatch(actions.getApplications(1))但是两者都没有绑定动作props.

我不确定mapStateToProps是不是因为我不包括在内?我试图包括它,但它也没有用.

感谢任何帮助,我为下面的代码块的长度道歉.

import classNames from 'classnames';
import SidebarMixin from 'global/jsx/sidebar_component';

import Header from 'common/header';
import Sidebar from 'common/sidebar';
import Footer from 'common/footer';
import AppCard from 'routes/components/appCard';
import { getApplications } from 'redux/actions/appActions';

import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'

import actions from 'redux/actions';
import { VisibilityFilters } from 'redux/actions/actionTypes';


class ApplicationContainer extends React.Component {
    constructor(props){
    super(props)

    this.state = {
      applicants: []
    }

    this.onDbLoad = this.onDbLoad.bind(this)

  }
  onDbLoad(){
    console.log(this.props.dispatch)
     // this.props.getApplications(1)
  }

    render() {
    return (
        <Col sm={12} md={4} lg={4}>
            <PanelContainer style={panelStyle}>
                <Panel>
                    <PanelBody >
                        <Grid>
                            <Row>
                              { this.onDbLoad() }
                            </Row>
                      </Grid>
                    </PanelBody>
                </Panel>
            </PanelContainer>
        </Col>
    )}
}


function mapDispatchToProps(dispatch){

  return bindActionCreators({ getApplications: getApplications },dispatch)
}

export default connect(null, mapDispatchToProps)(ApplicationContainer);

@SidebarMixin
export default class extends React.Component {

    render() {
    const app = ['Some text', 'More Text', 'Even More Text'];

        var classes = classNames({
            'container-open': this.props.open
        })
        return (
            <Container id='container' className={classes}>
                <Sidebar />
                <Header />
        <Container id='body'>
          <Grid>
            <Row>
              <ApplicationContainer />
            </Row>
          </Grid>
        </Container>
                <Footer />
            </Container>
    )}
}
Run Code Online (Sandbox Code Playgroud)

Int*_*ang 48

正如你在问题中提到的,mapDispatchToProps应该是第二个参数connect.

如果您没有要执行任何状态映射,则可以null作为第一个参数传递:

export default connect(null, mapDispatchToProps)(ApplicationContainer);
Run Code Online (Sandbox Code Playgroud)

执行此操作后,this.props.getApplications将受到约束.


根据您的评论,如果您想要访问this.props.dispatchINSTEAD的绑定操作,只需调用connect()而不传递任何映射器,默认行为将注入dispatch.

如果您想要两个绑定的动作创建者this.props.dispatch,您还需要向dispatch传递给的对象添加一个mapDispatchToProps.有点像dispatch: action => action.或者,既然你没有把所有东西放在根密钥下(比如actions),你可以这样做:

function mapDispatchToProps(dispatch) {
  let actions = bindActionCreators({ getApplications });
  return { ...actions, dispatch };
}
Run Code Online (Sandbox Code Playgroud)


mar*_*son 48

根据http://redux.js.org/docs/FAQ.html#react-props-dispatch上的Redux FAQ问题,this.props.dispatch如果您提供自己的mapDispatchToProps功能,则默认可用.如果你这样做提供一个mapDispatchToProps功能,你负责返回一个名为道具dispatch自己.

或者,您可以确保使用Redux的bindActionCreators实用程序预先绑定您的操作创建者,并且不必担心this.props.dispatch在组件中使用.