Reactjs 组件如何神奇地接收'dispatch'作为其第一个参数?
我很难理解这个神奇的论点,它突然出现在一个演示组件的第一个论点中 到目前为止,我的理解是第一个Reactjs 组件如何神奇地接收'dispatch'作为其第一个参数?,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我很难理解这个神奇的论点,它突然出现在一个演示组件的第一个论点中 到目前为止,我的理解是第一个AddTodo被认为是表示组件,后者是容器组件 在这种情况下,表示组件似乎被注入了dispatch作为第一个参数。不幸的是,回首往事后,我感到困惑,并意识到情况并非如此 dispatch参数在演示文稿组件中如何显示?当您在:AddTodo=connect()(AddTodo)中使用connect()时,您正在使用dispatch组件注入调度现在可通过道具在组件中使用。如果使用参数解构,则可以将其称为th
AddTodo
被认为是表示组件,后者是容器组件
在这种情况下,表示组件似乎被注入了dispatch
作为第一个参数。不幸的是,回首往事后,我感到困惑,并意识到情况并非如此
dispatch
参数在演示文稿组件中如何显示?当您在:AddTodo=connect()(AddTodo)
中使用connect()
时,您正在使用dispatch
组件注入<代码>调度
现在可通过道具在组件中使用。如果使用参数解构,则可以将其称为this.props.dispatch()
,或者直接称为dispatch()
,即let AddTodo=({dispatch})..
以下是官方redux文档中的详细描述:
连接([mapStateToProps]、[mapDispatchToProps]、[mergeProps]、[options])
[mapDispatchToProps(dispatch,[ownProps]):dispatchProps](对象或函数):如果传递了一个对象,则其中的每个函数都将假定为Redux操作创建者。一个具有相同函数名的对象,但每个动作创建者都封装在一个分派调用中,因此可以直接调用它们,将合并到组件的props中。如果函数被传递,它将被分派。这取决于您返回一个对象,该对象以某种方式使用dispatch以您自己的方式绑定动作创建者。(提示:您可以使用Redux中的bindActionCreators()帮助程序。)如果省略它,默认实现只是将分派注入组件的props中。如果将ownProps指定为第二个参数,则其值将是传递给组件的props,当组件收到新道具时,mapDispatchToProps将被重新调用
react-redux可以接收一个mapDispatchToProps
参数,用dispatch
调用包装动作创建者。如果未通过mapDispatchToProps
,connect
将使用:
正如您所看到的,返回了具有
dispatch
属性的对象。此对象将与mapStateToProps
中的道具以及通过属性传递给组件的任何道具(ownProps
)合并。最终对象将是通过connect
传递给原始组件的道具 正如Piotr Berebecki所说,connect()
注入分派。它将其注入到props中,({dispatch})
正在从props中解构dispatch,并将其分配给变量dispatch
您可以重写AddTodo
:
let AddTodo = (props) => {
const { dispatch } = props;
...
};
示例中有超链接错误…只是为了强调参数的分解。并不是说第一个参数“神奇地”是
dispatch
函数。该参数实际上是传递给组件的props
,并附加了dispatch
属性。感谢您强调默认行为。。。我错过了这一行,直到你的粗体格式……)谢谢你@DiegoCardosa,我根据你的评论更新了我的答案。很高兴能帮上忙,@piotr。但有一件事,那就是“卡多佐”;)lolOops,对不起@DiegoCardoso;)哦,我明白了,。。。感谢您对源代码的强调。我更清楚地理解了文档中提到的默认值是如何实现的。
const Todo = ({ onClick, completed, text }) => (
/* Omitted */
)
Todo.propTypes = {
onClick: PropTypes.func.isRequired,
completed: PropTypes.bool.isRequired,
text: PropTypes.string.isRequired
}
const defaultMapDispatchToProps = dispatch => ({ dispatch })
let AddTodo = (props) => {
const { dispatch } = props;
...
};