当前位置: 首页 > 知识库问答 >
问题:

为什么mapStateToProps和mapDispatchToProps不是Redux中的一个函数?

权兴为
2023-03-14

有人能给我解释一下为什么Redux有两个函数mapStateToProps和mapDispatchToProps都将道具添加到容器中吗?

定义:

MapStateTops是一个帮助组件获得更新状态(由其他组件更新)的实用程序

mapDispatchToProps是一个实用程序,它将帮助您的组件触发操作事件(调度操作可能导致应用程序状态的更改)

为什么Redux团队选择将其分为两个映射函数——也就是说,为什么不只有一个函数mapToProps(state、dispatch、props)同时执行这两个功能?

  • 仅仅是关注点的分离/更容易理解的原因吗?
  • 是因为mapDispatchToProps中的重新绑定的性能问题,为每次更改创建新函数吗?为操作创建绑定提供单独的函数将有助于避免这项额外的工作?考虑到每个状态更改都会调用mapStateToProps

例子:

const increaseAction = { type: 'increase' }

class Counter extends Component {
  render() {
    const { value, onIncreaseClick } = this.props
    return (
      <div>
        <span>{value}</span>
        <button onClick={onIncreaseClick}>Increase</button>
      </div>
    )
  }
}

function mapDispatchToProps(dispatch) {
  return {
    onIncreaseClick: () => dispatch(increaseAction)
  }

}

在codesandbox上查看此Redux示例

共有1个答案

栾烨华
2023-03-14

@Andrey Prokhorov是对的,你问的很有趣。今天早些时候,我发现自己处于github问题的内部,并发现了这个问题(将state添加mapDispatchToProps的第三个参数)。虽然标题似乎没有关联,但如果你仔细阅读评论,gaearon(react-redux的创造者)解释道:

请看看#1。这一选择已被考虑和拒绝。是的,在每次调度中重新绑定动作创建者对性能非常不利,如果我们让人们在绑定动作创建者的同一个地方访问状态,就会发生这种情况。从技术上讲,他们现在仍然可以用合并道具来做,但是它隐藏得足够好,没有Redux经验的人不会错误地发现它。

我还链接到了gaearon链接到react-redux讨论的第一个问题(实际上是github上react-redux的第一个问题)。我相信他们可以把它改成你描述的方式,但我认为盖伦的评论总结了这一点:

这个库的目标是鼓励性能模式,否则人们会说“Redux太慢了!”即使原因是它们的次优函数绑定代码。我们不希望这种情况发生,所以我们宁愿让某些未执行的案例更难实施。

 类似资料:
  • 我试图让一个简单的react-redux应用程序工作,但我遇到了一个奇怪的错误,我无法解决。我正在尝试简单地设置我当前用户的名字和处理商店,一个设置函数工作,而另一个不。 setCurrentUserFirstName-工作setCurrentUserHandle-不工作 我将它们作为操作放在useractions.js文件中 在减速器中 我有什么不对的?

  • 问题内容: react redux中的函数 和 参数之间有什么区别?任何人都可以通过示例给出适当的解释 问题答案: 是用于将存储数据提供给组件的功能,而将用于提供动作创建者作为组件的功能的函数。 根据文档: 如果 指定了参数,则新组件将订阅Redux存储更新。这意味着将在商店更新的任何时间被调用。的结果 必须是一个普通对象,该对象将合并到组件的道具中。 随着 每一次行动的创建者裹成一个调度呼叫,使

  • 问题内容: 我正在阅读Redux库的文档,其中包含以下示例: 除了读取状态之外,容器组件还可以调度动作。以类似的方式,您可以定义一个名为的函数,该函数接收该方法并返回要注入到演示组件中的回调道具。 这实际上是没有意义的。为什么现在已经有需要? 他们还提供了以下方便的代码示例: 有人可以用外行的术语解释一下此功能是什么以及为什么有用吗? 问题答案: 我觉得没有一个答案明确了为什么有用。 这实际上只能

  • 我正在阅读Redux库的文档,它有以下示例: 除了读取状态,容器组件还可以调度操作。以类似的方式,您可以定义一个名为的函数,该函数接收方法并返回要注入到表示组件中的回调道具。 这实际上毫无意义。既然已经有了,为什么还需要? 它们还提供了以下方便的代码示例: 这个函数是什么?它为什么有用?

  • 问题内容: 我正在尝试了解react-redux的connect方法及其作为参数的功能。特别是。 以我的理解,它的返回值将是一个从状态派生的对象(因为它存在于商店中),其键将作为道具传递给目标组件(应用了connect的组件)。 这意味着目标组件所消耗的状态与存储在商店中的状态可能具有截然不同的结构。 问:可以吗? 问:这是预期的吗? 问:这是反模式吗? 问题答案: 问: 答:是的 问: 是的,这

  • 问题内容: 为什么Redux中的对象是不可变的?我知道某些框架(例如Angular2)将使用onPush并可以利用不变性来比较视图状态以更快地呈现,但是我想知道是否还有其他原因,因为Redux与框架无关,但它在其自己的文档中提到要使用不变性(与框架无关)。 感谢任何反馈。 问题答案: Redux是一个小型库,将状态表示为(不可变的)对象。和 新状态 通过将当前状态传递给纯函数来创建全新的对象/应用