【问题标题】:What is the difference between mapDispatchToProps and matchDispatchToPropsmapDispatchToProps 和 matchDispatchToProps 有什么区别
【发布时间】:2018-01-03 06:29:19
【问题描述】:

标题解释了问题。

我正在使用 redux 将用户状态更改为活动或非活动用户。

在 matchDispatchToProps 中:

function matchDispatchToProps(dispatch){
  return bindActionCreators({selectUser: selectUser}, dispatch);
}

在 mapDispatchToProps 的情况下:

const mapDispatchToProps = (dispatch) => ({
    dispatch({selectUser: selectUser})
})

请解释一下它们之间的区别。

【问题讨论】:

  • 差异是什么意思?两种情况都会导致相同的结果...
  • 所以创建两种方式应该有一些区别。视情况而定,有一些好处和坏处。

标签: reactjs react-native redux react-redux


【解决方案1】:

这里有两件事。

首先,connect() 的第二个参数的正确名称称为mapDispatchToProps。它也经常被称为mapDispatch。但是,就像 JS 中的任何函数调用一样,调用你的变量并不重要——你可以调用你的函数mapDispatchToPropsmapDispatchfred ,或someFunctionName。 (也就是说,我不知道你为什么叫它matchDispatchToProps,或者你在哪里听到这个名字。)

其次,您的两个示例函数非常不同。 mapDispatch 函数的意图是返回一个对象,对象中的每个键/值都将成为组件的道具。通常,您将在该对象内返回绑定的动作创建者函数,以便该组件将接收像this.props.doSomeWork() 这样的道具。您的第一个示例(return bindActionCreators({selectUser}, dispatch))将正确执行此操作。

您的第二个示例似乎不是有效的 JS 语法:

const mapDispatchToProps = (dispatch) => ({
    dispatch({selectUser: selectUser})
})

我们有一个箭头函数可以立即返回一个对象,但它没有在对象中声明键/值对,而是试图立即调用dispatch。这根本无效。

【讨论】:

    【解决方案2】:

    matchDispatchToProps 不是react-redux 中的标准引用。我将概述connect HoC 的工作原理。

    connect HoC 有四个参数; mapStateToPropsmapDispatchToPropsmergePropsoptions。在mapStateToProps 中,您指定了您希望在组件中可用的商店中的哪些信息,如下所示:

    mapStateToProps = ( state ) => ({
        user: state.user
    });
    

    mapDispatchToProps 中,您将功能作为道具提供给您的组件,这些功能可以访问您商店的dispatch 方法,如下所示:

    mapDispatchToProps = ( dispatch ) => ({
        updateUser: ( user ) => {
            dispatch( updateUser( user ) );
        }
    });
    

    注意updateUser 是一个 actionCreater,你可以创建。

    然后您可以将它们与connect HoC 一起使用,如下所示:

    MyConnectedComponent = connect( mapStateToProps, mapDispatchToProps )( MyComponent );

    现在您可以使用<MyConnectedComponent /> 并在<MyComponent /> 代码内部访问({ user, updateUser }) 属性。

    注意connect 也可以接受 null 参数。 connect()( Component ) 将使 dispatch 在您的组件中作为道具可用。这是没有任何参数的默认设置。您也可以connect( null, mapDispatchToProps )( Component ) 使updateUser 成为组件中的道具,而无需将组件连接到商店。如果您想从商店访问user,也可以connect( mapStateToProps )( Component ),但无需从组件内调度。

    其他信息

    [mergeProps(stateProps, dispatchProps, ownProps): props] (函数):

    如果指定,则传递 mapStateToProps()、mapDispatchToProps() 和父 props 的结果。您从中返回的普通对象将作为道具传递给包装的组件。您可以指定此函数以根据 props 选择状态切片,或将动作创建者绑定到 props 中的特定变量。如果省略,则默认使用 Object.assign({}, ownProps, stateProps, dispatchProps)。


    [选项](对象)

    如果指定,则进一步自定义连接器的行为。除了可传递给connectAdvanced() 的选项(见下文)之外,connect() 还接受这些附加选项:

    • [pure](布尔值):如果为 true,如果相关的 state/props 对象根据它们各自的相等性检查保持相等,connect() 将避免重新渲染和调用 mapStateToProps、mapDispatchToProps 和 mergeProps。假设被包装的组件是一个“纯”组件,并且不依赖于任何输入或状态,除了它的 props 和选定的 Redux 存储的状态。默认值:真

    • [areStatesEqual](功能):当纯时,将传入的存储状态与其先前的值进行比较。默认值:strictEqual (===)

    • [areOwnPropsEqual](功能):当纯时,将传入的道具与其先前的值进行比较。默认值:shallowEqual

    • [areStatePropsEqual](功能):纯时,将 mapStateToProps 的结果与其之前的值进行比较。默认值:shallowEqual

    • [areMergedPropsEqual](功能):纯时,将mergeProps的结果与其先前的值进行比较。默认值:shallowEqual

    • [storeKey](字符串):从何处读取存储的上下文的键。如果您处于拥有多家商店的不可取的位置,您可能只需要这个。默认值:“商店”

    完整的文档可以在reactjs/react-redux找到。

    【讨论】:

      【解决方案3】:

      相信你一定从 Bucky 的 ReactJS 和 Redux 教程中听说过 matchDispatchToProps 这个词。

      这个函数的通用名称实际上是mapDispatchToProps

      但我不会说 Bucky 犯了一个错误,因为实际上,只要将相同的名称传递给 connect() 方法的第二个参数,这个函数就可以调用任何东西。

      示例:

      const mapDispatchToProps = (dispatch) => {
        return bindActionCreators({selectUser}, dispatch);
      }
      
      const mapStateToProps = (state) => {
        return {
          user: state.user,
        }
      }
      
      export default connect(mapStateToProps, mapDispatchToProps)(myComponent);
      

      如果你没有将 state 映射到 props,那么第一个参数可以是 null

      示例:

      const mapDispatchToProps = (dispatch) => {
        return bindActionCreators({selectUser}, dispatch);
      }
      
      export default connect(null, mapDispatchToProps)(myComponent);
      

      【讨论】:

        【解决方案4】:

        这是一个很好的问题,它提醒我们作为开发人员,在做了这么长时间的事情之后,有时我们有时会混淆约定和需求。

        从技术上讲,我们可以随意称呼它,不必一定是 mapStateToPropsmapDispatchToProps,但按照惯例,我们称之为它们,因为当我们具有这种一致性水平时,它会使我们的工作更轻松。

        所以唯一的区别在于命名约定,这些不是内置函数,它们在彼此之间执行独特的特定操作。其实后者是不习惯用的,我指的是你的matchDispatchToProps,不过你想用当然可以用。

        【讨论】:

          猜你喜欢
          • 2018-01-01
          • 2019-07-22
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          • 2012-03-14
          • 2012-02-06
          • 2011-02-25
          • 2011-11-22
          相关资源
          最近更新 更多