我正在阅读redux的示例文档,我发现了这个容器组件的例子。有人可以解释为什么在这种情况下不需要mapDispatchToProps。同样,函数如何获得调度函数?
import React from 'react'
import { connect } from 'react-redux'
import { addTodo } from '../actions'
let AddTodo = ({ dispatch }) => {
let input
return (
<div>
<form onSubmit={e => {
e.preventDefault()
if (!input.value.trim()) {
return
}
dispatch(addTodo(input.value))
input.value = ''
}}>
<input ref={node => {
input = node
}} />
<button type="submit">
Add Todo
</button>
</form>
</div>
)
}
AddTodo = connect()(AddTodo)
export default AddTodo
答案 0 :(得分:9)
80
会将connect()(AddTodo)
作为dispatch
组件传递,即使没有状态或预定义操作,该组件仍然有用。这就是代码中不需要prop to AddTodo
的原因
现在,在您的组件mapDispatchToProps
中,您将对道具进行解构,以便仅访问let AddTodo = ({ dispatch }) => {
。
如果您使用dispatch
,则会将mapDispatchToProps
操作作为组件的支柱,然后将其称为addTodo
。所以上面的方法是另一种选择。
this.props.addTodo
只是通过React上下文传递connect
,因此您不必通过许多组件传递商店。你不必使用连接。任何模块/ HOC模式都可以工作,连接恰好是一个方便的东西。
在组件中使用store / dispatch
或使用dispatch
是同一件事。
但是,使用mapDispatchToProps
可以更灵活地构建代码并将所有动作创建者放在一个位置。
根据 docs :
[mapDispatchToProps(dispatch,[ownProps]):dispatchProps](对象或函数):
如果传递了一个对象,则其中的每个函数都被假定为Redux动作创建者。具有相同功能名称但具有的对象 每个动作创建者都包含在一个调度呼叫中,因此它们可能是 直接调用,将合并到组件的道具中。
如果传递函数,它将作为第一个参数发送。你可以归还一个以某种方式使用的对象 发送以您自己的方式绑定动作创建者。 (提示:你可以使用 来自Redux的
mapDispatchToProps
助手。)如果您的
bindActionCreators()
函数被声明为两个 参数,它将被调用作为第一个参数和 道具作为第二个参数传递给连接组件, 并且只要连接的组件收到新的,就会重新调用 道具。 (第二个参数通常称为ownProps by 约定。)如果您不提供自己的
mapDispatchToProps
功能或对象 完整的动作创建者,默认mapDispatchToProps
实现只是将调度注入组件的道具。
答案 1 :(得分:0)
人们倾向于以两种方式写react
。一种是基于class
的方法,您通常会遇到这种方法。它基本上使用类。
class App extends Component{
constructor(){
super();
this.state={}
}
render(){
return(
//
);
}
}
和其他是functional approach
。
const App = (props) => {
return(
<div><h2>{{props.name}}</h2></div>
)
}
因此,在功能方法中,您可以将数据作为arguments
传递给组件。
因此,如果您已将dispatch
从父组件传递到props
中的此组件。您可以使用props.dispatch
访问它。