2016-04-25 34 views
19

我想从我的智能组件中调度一个动作。我试过使用mapDispatchToPropsthis.props.dispatch(actions.getApplications(1)),但都没有将这些操作绑定到propsThis.props.dispatch不是函数 - React-Redux

林不知道是否因为我的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> 
    )} 
} 

回答

33

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

如果您没有任何状态映射做,你可以通过null作为第一个参数:

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

完成这一步之后,再this.props.getApplications将被绑定。


根据你的评论,如果你想有机会获得this.props.dispatch的INSTEAD约束力的行动,只需拨打connect()不传递任何映射器,并且默认行为将注入dispatch

如果要同时拥有绑定动作创建者和this.props.dispatch,则还需要将dispatch添加到传递给mapDispatchToProps的对象。像dispatch: action => action。或者,因为你不是根键下把一切(如actions),你可以这样做:

function mapDispatchToProps(dispatch) { 
    let actions = bindActionCreators({ getApplications }); 
    return { ...actions, dispatch }; 
} 
+0

感谢您的快速响应,我已经尝试过您的解决方案,但派送仍然不会显示为“道具”。 – richTheCreator

+0

你是否特别想使用'dispatch'?或者你想让你的其他行动受到约束。如果前者,我可以更新答案。 – Interrobang

+0

我想分发一个动作,以便它可以通过减速器。 – richTheCreator

23

%的终极版FAQ问题在http://redux.js.org/docs/FAQ.html#react-props-dispatchthis.props.dispatch默认提供,如果你供应您自己的mapDispatchToProps功能。如果你提供mapDispatchToProps函数,你自己负责返回一个名为dispatch的道具。

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

+1

感谢您的回复。我的'mapDispatchToProps'返回'bindActionCreators' – richTheCreator