当前位置: 首页 > 面试题库 >

没有mapDispatchToProps的连接如何工作

姜钊
2023-03-14
问题内容

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

问题答案:

connect()(AddTodo)dispatch作为一个prop to AddTodo组件传递,即使没有状态或预定义的动作也仍然有用。多数民众赞成在mapDispatchToProps不需要您的代码的原因

现在,在组件中,let AddTodo = ({ dispatch }) => {您正在分解道具以仅访问dispatch

如果您利用它,mapDispatchToProps可以将您的addTodo操作作为对组件的支持,然后将其命名为this.props.addTodo。因此,上述方法是替代方法。取决于您选择自己喜欢的东西

connect只是store / dispatch通过React上下文传递,因此您不必通过许多组件传递商店。不过,您不必使用connect。任何模块/
HOC模式都可以工作,连接只是碰巧使用方便。

使用dispatch的组件或使用mapDispatchToProps是同一个东西。

但是,使用可以mapDispatchToProps为您提供更大的灵活性来构造代码并使所有动作创建者都集中在一个地方。

根据 文档

[mapDispatchToProps(dispatch,[ownProps]):dispatchProps](对象或函数):

如果传递了一个对象 ,则假定 该对象
内部的每个函数都是Redux操作创建者。一个具有相同功能名称的对象,但是每个动作创建者都包装在一个调度调用中,以便可以直接调用它们,这些对象将合并到组件的props中。

如果传递了一个函数,
它将作为第一个参数被分配。由您决定返回一个对象,该对象以某种方式使用分派以自己的方式绑定动作创建者。(提示:您可以使用bindActionCreators()Redux
的帮助程序。)

如果您的mapDispatchToProps函数声明为带有两个参数,则将使用dispatch作为第一个参数,将props传递给连接的组件作为第二个参数,并在连接的组件收到新的props时重新调用它。(按照惯例,第二个参数通常称为ownProps。)

如果您不提供自己的mapDispatchToProps功能或充满动作创建者的对象,则默认mapDispatchToProps
实现只是将dispatch注入到组件的props中。



 类似资料:
  • 问题内容: 上面的示例显示了具有多个名称空间的XML文件的示例。这些名称空间的目的是什么,最重要的是,即使没有Internet连接,它们为什么也可以工作? 我认为从第二位开始包含XML模式文件,这些文件用于验证XML文档的结构。如果我在不在网络上的计算机上运行使用此配置文件的应用程序,这些仍然如何工作?URL是JAR文件的别名吗? 问题答案: 让我们假设我们有这个XML文档。 它包括HTML,该H

  • 操作系统:Ubuntu 17.10 Python:2.7 Sublime文本3: 我正在尝试导入mysql.connector, 没有名为连接器的模块 不过,当我尝试导入mysql时。在pythonshell中,它可以工作。 早些时候它工作得很好,我刚刚升级了Ubuntu,不知何故mysql连接器不工作。 我尝试重新安装mysql连接器使用pip和git两者。 还是不走运。 请帮忙!

  • 假设您使用一个(阻塞)生物连接器,如下所示: 你做了201个并发连接,最后一个连接会发生什么? 如果您创建了1001个并发连接,那么最后一个连接会发生什么? 接下来,让我们使用一个(非阻塞)NIO连接器 如果我们进行201和1001并发连接,会有什么不同吗? 据我所知,NIO和NIO2之间没有行为差异,只有实现不同,这是真的吗? 我制作了一个小servlet如下所示: 设置这些设置并发出50个并发

  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的

  • 在我的项目中,我使用了@Configuration、@EnableAutoConfiguration、@ComponentScan和带有注释的重要资源配置。我没有使用@SpringBootApplication,但应用程序在没有@SpringBootApplication注释的情况下成功构建。我不明白为什么不调用@RestController类?

  • 我尝试为我的数据创建带有“转换”的插件到kafka-connect,并将其与不同的接收器连接器一起使用。当我安装插件时,kafka-connect看不到我的类。 我使用kafka connect maven插件创建了我的捆绑包zip。使用confluent hub(来自本地文件)的安装已成功。 所有文件都已解压,我的工作者属性已更新插件。路径。我在分布式模式下运行connect,并尝试从包中创建带