如何将 componentDidMount() 与 React-Redux connect() 混合使用?

2024-02-19

这似乎是一个简单的用例,但我无法弄清楚。我想显示从通过 HTTP 对远程 API 的请求中检索到的项目列表。我希望在请求发生时屏幕最初显示空白,然后在可用时填充结果。

所以我想我会有两个组件:哑的“项目列表”组件和包装器“演示”组件,呃,以某种方式启动远程请求,同时使用状态中的空项目列表渲染哑组件。

我知道如何启动初始远程请求:使用componentDidMount().

我知道如何处理调度/连接:我想使用类似的东西:

const OuterWrapper = connect(
   mapStateToProps,
   mapDispatchToProps
) (ItemList)

但我怎样才能让这些东西一起发挥作用呢?使用connect()似乎把事情变得遥不可及。我想异步启动 API 请求,然后以某种方式执行 `dispatch(updateItemList(items)) 来告诉世界有新项目要添加到状态中。

EDIT:

I found 反应生命周期组件 https://github.com/JamieDixon/react-lifecycle-component,但我不明白之前和之后的示例用法。在更长的情况下为什么是getAllTehDatas引用两次?为什么它在mapDispatchToProps显然没有key:value一对?如果的话,为什么还需要在那里呢?componentDidMount()称之为?如果需要使用该方法,你该怎么办dispatch()?


首先,关于您的编辑,该存储库中的组件旨在让您将函数作为 props 传递给组件。这些将在任何时候运行React 生命周期方法 https://facebook.github.io/react/docs/react-component.html#componentdidmount正在运行。这是有原因的。但这些原因在该存储库中进行了解释,与您的问题无关。

另外,你还看到了这个:

const mapDispatchToProps = { getAllTehDatas };

这是 ES6 简写符号。它的意思只是:

const mapDispatchToProps = { getAllTehDatas: getAllTehDatas };

也就是说,属性的名称与变量的名称相同。因为这是一个很常见的操作,所以有人聪明地想出了这个简写。如果您不了解这一点,可能会感到非常困惑。你应该阅读关于ES6 http://es6-features.org/.

Onward.

有很多概念没有明确界定。愚蠢的组件。智能组件。容器组件。展示组件。连接的组件。纯功能组件。很多。

容器组件are智能组件和演示组件are愚蠢的组件。

有时,愚蠢的组件也有一点聪明。也许他们在鼠标悬停时有动画。他们甚至可以拥有状态。

纯函数组件只是一个函数。所以没有方法,也没有状态。这意味着只有道具。由于不可能有状态或额外的逻辑,纯函数组件总是具有表现性的。

连接的组件是高阶组件。这只是一个将您的组件呈现为子组件的父组件。它还在优化渲染方面发挥了一些作用。

展示组件应该只显示东西,而不应该做东西。如果当您单击或输入内容时事情就完成了,那么它应该由父级处理,父级可以将处理程序传递给演示组件。展示组件可以做的事情some事物,但这些事物不能影响它们之外的任何事物。

容器组件应该决定发生什么。这就是逻辑被塞满的地方。它更像是一个 React 概念,而不是 Redux 概念。

连接的组件是用以下命令创建的connect。当它被调用时,我们传递一些函数。mapStateToProps and mapDispatchToProps.

mapStateToProps可以做任何需要的事情来生成一些道具供您的组件使用。这意味着您的组件可以使用这些道具,而无需进一步处理数据。所有需要的处理都可以在mapStateToProps.

mapDispatchToProps可以执行任何需要执行的操作来传递直接用作事件处理程序的函数。通常我们会传递绑定的动作创建者,它们通常已经完成了处理程序需要做的所有事情。但我们可以传递任何函数并给它任何名称。所以我们可以称之为onClick并传递我们喜欢的任何函数。您还可以借助 Redux-Thunk 创建复杂的操作创建器,将任何事件处理程序变成智能操作创建器。 Thunked 动作创建者可以访问调度和状态。

上面两段概述了一个有趣的点:由connect在我们的帮助下mapStateToProps and mapDispatchToProps可以很容易地制作成一个完整的智能组件,并且包装的组件可以完全具有演示性,即使最终的 HOC 是为了做智能的事情。

或者得到这个:你可以connect已连接的组件。当然,令人兴奋。这样做有用吗?当然可以。无论组件在何处使用,它都可能需要来自状态的一些常规数据。你connect到该数据。然后得到的组件可以是connect编辑为特定于其在其他地方使用的地方的数据。常见的?没有,有用吗?是的!

您还可以将演示组件包装在容器组件中,然后将其包装为connect。这可能就是您正在寻找的。然后您可以使用componentDidMount在容器组件中进行提取。

但表现组件与其智能部分的有效分离有两个原因:

  • 可重复使用性
  • 可测试性

如果您两者都不需要,那么您不应该将两者分开。为什么要把事情复杂化却没有任何好处呢?

另外,使用componentDidMount, not componentWillMount。如果您使用通用组件,后者也可以在服务器端运行。您不希望您的提取在服务器上运行。

请注意,即使连接的组件显然是一个包装器,您也不应该这样认为。将其视为原始版本的插件版本。包装只是一个实现细节。此外,包装器是由 React-Redux 创建和维护的,它的内部不能被搞乱。这意味着您无法更改componentDidMount包装纸或与此相关的任何其他部分。当我说你不能时,我的意思是你完全可以,但实际上不应该。

回顾一下,我建议了解 React、Redux 和 React-Redux。它们配合得很好,但并不是同一件事。

掌握概念后,您只需做您认为最好的事情即可。制定自己的规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 componentDidMount() 与 React-Redux connect() 混合使用? 的相关文章

  • 调用“DOMNodeInserted”事件时添加元素

    我想在每个 喜欢 按钮 chrome 扩展 之后添加一个元素 由于帖子被添加到新闻提要而不刷新页面 我必须添加一个事件侦听器 DOMNodeInserted 但是当我尝试把after 里面的功能 它不起作用 Code contentArea
  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 请解释与 Google Chrome 扩展程序的后台通信

    我已经阅读并重新阅读了此页面 并运行了示例 http code google com chrome extensions background pages html http code google com chrome extension
  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen
  • jQuery 中的 Javascript .files[0] 属性

    jQuery 中是否有与此语句等效的语句 var value document getElementById id files 0 使用附加 files 0 的标准 jQuery 选择器似乎不起作用 并且我找不到与 files 等效的 jQ
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 何时不使用承诺[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在阅读了数十篇关于 es6 Promise 有多伟大以及为什么我们应该实现它们的文章之后 我有这样的感觉 ALL我的 不平凡的 JavaScri
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • ElectronJS ReferenceError:导航器未定义

    我正在尝试在电子上制作自定义标题栏 但是当我启动我的应用程序时 我遇到了 ReferenceError 导航器未定义 问题 请帮忙 这是我的 main js 中的代码片段 My Codes https i stack imgur com c
  • 在 MVC Razor 中的 C# 和 Javascript 之间共享常量

    我想在服务器上的 C 和客户端上的 Javascript 中都使用字符串常量 我将常量封装在 C 类中 namespace MyModel public static class Constants public const string
  • Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

    我主要了解 Ember JS 的基础知识 大多数示例实际上只处理单个控制器和模型以在页面上显示某些内容 我真的很想用 Ember 构建一个完整的 Web 应用程序 所以有人能告诉我如何组织和连接多个控制器 模型和视图到一个页面中吗 例如 如
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • 如何滚动到div内的元素?

    我有一个滚动的div我想在点击它时发生一个事件 它会强制执行此操作div滚动以查看内部元素 我写的JavasCript是这样的 document getElementById chr scrollIntoView true 但这会在滚动时滚
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • Jquery:选择菜单以显示和隐藏某些div元素

    我正在创建一个选择菜单 根据所选选项显示和隐藏某些 div 像这样的东西
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460

随机推荐

  • Pandas 通过正则表达式读取带有字符串分隔符的 CSV

    我正在尝试将格式奇怪的文本文件导入到 pandas DataFrame 中 下面是两个示例行 LOADED LANE 1 MAT TYPE 2 LEFFECT 1 SPAN 200 SPACE 10 BETA 3 474 LOADEFFEC
  • Javascript:用另一个函数重新分配一个函数

    假设我有这两个功能 function fnChanger fn fn function sys print Changed function foo sys print Unchanged 现在 如果我打电话foo I see Unchan
  • PHP“未选择数据库”

    我最近开始用 PHP 创建一个网站 我的大部分代码都可以工作 但是我发现了一个无法纠正的问题 我有一个页面 其中有很多对数据库的调用 在我的页面顶部 我正在连接并使用 SELECT 来获取有关相关产品的一些信息 在页面底部 我再次连接以获取
  • 如何使用 Zend Framework 2 中的插件渲染自定义视图

    我正在开发一个应用程序 需要在流程完成后发送电子邮件 由于电子邮件需要是 HTML 我有一个好主意 将视图渲染为电子邮件消息正文 以便我可以实现 单击此处在浏览器上查看此内容 功能 这一切都在实现 AbstractRestfulContro
  • 如何用 Maven 属性替换 web.xml 中的值?

    我有一个 Maven 项目 它将一些测试文件下载到其构建目录中 target files 然后 这些文件应该可供 servlet 使用 我可以通过将完整路径硬编码为
  • 如何跳过HTTP请求的AngularJS拦截器?

    我有一个 angularjs 应用程序 其中有一个拦截器 它将授权令牌添加到每个请求的标头中 然而 在应用程序的某个地方 我需要使用外部 API 拦截器会破坏它 因为它添加了这个外部 API 提供者不接受的授权标头 如何让 angularj
  • VS2013 Windows服务-如何制作安装程序?

    我写了一个Windows服务 我现在想将其打包到安装程序中 我使用了 VS2013 x86 Native Tools 命令提示符 然后使用了以下命令 要安装它 installutil httpapiservice exe 要卸载它 inst
  • 启动Spring Boot应用程序时liquibase的问题

    我有一个Spring Boot申请与liquibase 第一次我创建表格没有问题 但当我再次启动时 我遇到了无法解决的问题 这是error Error starting ApplicationContext To display the c
  • 读取外部网页的内容并获取特定元素[重复]

    这个问题在这里已经有答案了 可能的重复 如何用PHP解析和处理HTML https stackoverflow com questions 3577641 how to parse and process html with php 我已经
  • 如何确保我使用的是“服务器”JVM?

    Sun 的 JVM 有两种风格 client and server 其中服务器 VM 应针对长时间运行的进程进行优化 建议用于服务器应用程序 当我跑步时java如果没有参数 它会显示使用选项 其中包括以下文本 The default VM
  • 减小 EPS 格式的绘图大小

    我有一个包含数百个项目的直方图 我为其绘制了 Q Q 图 这导致 EPS 大小为 2 5 兆字节 对于仅包含在出版物中并且不会以 100 倍放大倍率查看的图形来说 这太大了 R 中是否有任何选项可以以某种方式输出较小的 EPS 我搜索过文档
  • 无法在任何地方运行 jupyter(终端、anaconda 分发器)Mac os 10.12.6

    我在终端中运行 jupyter 时遇到问题 运行后终端显示什么 maxim MacBook Pro Maxim jupyter notebook Traceback most recent call last File Library Fr
  • 如何在C#中获取Windows面板控件中的Keypress事件

    我想在 C 中的 Windows 面板控件中获取按键事件 对我有帮助吗 你应该处理面板按键 http msdn microsoft com en us library system windows forms panel keypress
  • 弹簧形式:输入数字

    我正在使用 Spring 的 form input 如下
  • VS 扩展中未处理的异常

    我尝试为自定义文件定义创建语法突出显示 加载时出现异常 我已将 log 参数添加到 devenv 以获取日志 335 ERROR System Exception Duplicate EditorFormatDefinition expor
  • Python 中 OLS 的 Newey-West 标准错误?

    我想要一个系数和与之相关的 Newey West 标准误差 我正在寻找可以执行以下 R 代码正在执行的操作的 Python 库 理想情况下 但任何可行的解决方案都可以 library sandwich library lmtest a lt
  • 为什么我使用 OpenLayers 在两个弹出窗口中获得相同的文本

    我正在使用 OpenLLayers 5 我将经度 纬度和汽车名称保存在数据库中的数组中 我可以显示两个标记 我的数组目前只有两个索引 每个标记都有一个弹出窗口 其中应包含其名称 经度 纬度 例如 第一个标记的弹出窗口将汽车 1 作为文本 在
  • 使用 FQL 聆听音乐 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用 FQL 为用户和用户的朋友获取 music listens 有谁知道获取 music l
  • rake db:test:prepare 实际上做了什么?

    我正在关注 Rails 教程视频 但我不明白它是什么db test prepare命令确实如此 有人可以提供解释吗 上面的 rake db migrate 运行任何挂起的迁移 开发环境并更新db schema rb 耙子 db test l
  • 如何将 componentDidMount() 与 React-Redux connect() 混合使用?

    这似乎是一个简单的用例 但我无法弄清楚 我想显示从通过 HTTP 对远程 API 的请求中检索到的项目列表 我希望在请求发生时屏幕最初显示空白 然后在可用时填充结果 所以我想我会有两个组件 哑的 项目列表 组件和包装器 演示 组件 呃 以某