我正在阅读Redux库的文档,其中包含以下示例:
除了读取状态之外,容器组件还可以调度动作。以类似的方式,您可以定义一个名为的函数mapDispatchToProps(),该函数接收该dispatch()方法并返回要注入到演示组件中的回调道具。
mapDispatchToProps()
dispatch()
这实际上是没有意义的。为什么现在mapDispatchToProps已经有需要mapStateToProps?
mapDispatchToProps
mapStateToProps
他们还提供了以下方便的代码示例:
const mapDispatchToProps = (dispatch) => { return { onTodoClick: (id) => { dispatch(toggleTodo(id)) } } }
有人可以用外行的术语解释一下此功能是什么以及为什么有用吗?
我觉得没有一个答案明确了为什么mapDispatchToProps有用。
这实际上只能在container- component模式的上下文中得到回答,我首先阅读以下内容对它有最好的理解:容器组件,然后与React结合使用。
container- component
简而言之,您components应该只关心显示内容。 他们应该从中获取信息 的 唯一地方是他们的道具 。
components
与“显示内容”(组件)分开的是:
那是containers为了什么。
containers
因此,模式中的“精心设计” component如下所示:
component
class FancyAlerter extends Component { sendAlert = () => { this.props.sendTheAlert() } render() { <div> <h1>Today's Fancy Alert is {this.props.fancyInfo}</h1> <Button onClick={sendAlert}/> </div> } }
查看此组件如何从props(来自redux存储,通过mapStateToProps)获取它显示的信息,以及如何从props:获取其action函数sendTheAlert()。
sendTheAlert()
那是mapDispatchToProps进来的:在对应的container
container
// FancyButtonContainer.js function mapDispatchToProps(dispatch) { return({ sendTheAlert: () => {dispatch(ALERT_ACTION)} }) } function mapStateToProps(state) { return({fancyInfo: "Fancy this:" + state.currentFunnyString}) } export const FancyButtonContainer = connect( mapStateToProps, mapDispatchToProps)( FancyAlerter )
我不知道你可以看到,现在它的container 1 ,它知道Redux的调度和存储以及州和......东西。
component模式中的in进行FancyAlerter渲染不需要了解任何东西:它onClick通过其props 获取其在按钮处调用的方法。
FancyAlerter
onClick
并且… mapDispatchToProps是redux提供的有用手段,它可以使容器轻松地将该函数传递给其props上的包装组件。
所有这些看起来都非常像docs中的todo示例,还有另一个答案,但是我试图根据模式来强调它 为什么 。
(注意:您不能mapStateToProps出于mapDispatchToProps无法访问dispatch内部的基本原因而使用同一目的mapStateToProp。因此,您不能使用mapStateToProps来为包装的组件提供使用的方法dispatch。
dispatch
mapStateToProp
我不知道他们为什么选择将其分为两个映射功能-IE可以mapToProps(state, dispatch, props) 同时使用这两个功能可能更简单!
mapToProps(state, dispatch, props)
1 请注意,我故意将容器明确命名为FancyButtonContainer,以强调它是“事物”- 容器的“物”的身份(因此存在!)有时会在速记中丢失
FancyButtonContainer
export default connect(...) ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
export default connect(...)
大多数示例中显示的语法