如何在没有mapDispatchToProps

时间:2017-01-16 05:47:06

标签: reactjs redux react-redux

我正在阅读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

2 个答案:

答案 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访问它。