我的印象是bindActionCreators
的目的是将actionCreators
包装在一个调度函数中,并为这些新函数赋予一个名称(可以通过{{传递给组件作为道具1}}和mapDispatchToProps
)。
但是,我发现的教程似乎在调度函数(connect
)上调用bindActionCreators
,这似乎违反了updatePerson
的全部内容。
动作/ update_person.js
bindActionCreators
组件/ WantedCard.js
import { UPDATE_PERSON } from './types';
export default function updatePerson(person) {
return dispatch => {
dispatch(updatePersonAsync(person));
}
}
function updatePersonAsync(person){
return {
type: UPDATE_PERSON,
payload: person
};
}
根据我的理解,我到底出错了什么? UpdatePerson已绑定(?)
这是教程回购:https://github.com/lorenseanstewart/redux-wanted-list和博文https://lorenstewart.me/2016/11/27/a-practical-guide-to-redux/
答案 0 :(得分:1)
UpdatePerson已绑定(?)
不,这不是你import
的正常功能
为了使其与redux
流程循环一致,您需要dispatch
此功能。
当你没有通过mapDispatchToProps
时,你会得到dispatch
函数作为连接组件的道具,所以要使用它,你必须这样做:
this.props.dispatch(updatePerson())
如果您决定将mapDispatchToProps
传递给connect
,那么您将不会获得dispatch
作为道具,但您可以用它包裹您的行动:
const mapDispatchToProps = dispatch => {
return {
updatePerson: () => {
dispatch(updatePerson())
}
}
}
或者您可以传递一个对象:
const mapDispatchToProps = {
updatePerson,
deletePerson
}
另一种方法是使用bindActionCreators
(就像你在帖子中提到的那样)
使用这种方法,您可以使用以下代码行调度操作:
function mapDispatchToProps(dispatch) {
return bindActionCreators({
updatePerson: updatePerson,
deletePerson: deletePerson
}, dispatch);
}
并称之为:
this.props.updatePerson()
请注意,如果密钥与变量
匹配,则可以使用Shorthand property names of ES2015function mapDispatchToProps(dispatch) {
return bindActionCreators({
updatePerson,
deletePerson
}, dispatch);
}
使用bindActionCreators
的另一个好方法是将所有操作导入为别名(甚至是来自不同文件的不同操作):
import * as userActions from '../url';
import * as otherActions from '../otherUrl';
然后将它们全部堆叠在一个对象中(如果需要,可以将它们分开):
function mapDispatchToProps(dispatch) {
const combinedActions = { ...userActions, ...otherActions };
return {
actions: bindActionCreators(combinedActions, dispatch)
};
}
现在您可以通过actions
对象引用任何操作:
this.props.actions.myAction();
this.props.actions.myOtherAction();
您可以在docs
中了解各种选项