我可以使用Redux中的mapStateToProps mapDispatchToProps吗?

时间:2017-12-05 15:37:25

标签: javascript redux

我正在分手Redux' todo例子试图理解它。我读到mapDispatchToProps允许您将调度操作映射为props,所以我想重写addTodo.js以使用mapDispatchToProps而不是调用dispatch(addTodo())。我叫它addingTodo()。像这样:

import React from 'react';
import {connect} from 'react-redux';
import addTodo from '../actions';

let AddTodo = ({addingTodo}) => {
  let input;
  return (
      <div>
        <form onSubmit={e => {
          e.preventDefault()
          if (!input.value.trim()) {
            return
          }
          addingTodo(input.value)
          input.value = ""
        }}>
          <input ref={node => {
            input = node
          }} />
          <button type="submit">Submit</button>
        </form>
      </div>
  )
}

const mapDispatchToProps = {
  addingTodo: addTodo
}

AddTodo = connect(
  mapDispatchToProps
)(AddTodo)

export default AddTodo

但是,当我运行该应用时,我收到此错误:Error: Invalid value of type object for mapStateToProps argument when connecting component AddTodo.。我从未使用mapStateToProps开始使用AddTodo组件,所以我不确定是什么问题。我的直觉表明,connect()希望mapStateToPropsmapDispatchToProps之前。{/ p>

工作原件如下:

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">Submit</button>
        </form>
      </div>
  )
}

AddTodo = connect()(AddTodo)

export default AddTodo

可以找到完整的回购here

所以我的问题是,是否可以在没有mapStateToProps的情况下执行mapDispatchToProps?我正在努力做一个可以接受的做法 - 如果不是,为什么不呢?

1 个答案:

答案 0 :(得分:85)

是的,你可以。只需将null作为第一个参数传递:

AddTodo = connect(
    null,
    mapDispatchToProps
)(AddTodo)

是的,这不仅仅是可以接受的做法,也是推荐的触发行动方式。使用mapDispatchToProps可以隐藏在反应组件中使用redux的事实