Flux 存储将更改发送到特定的 React 组件而不是所有组件。

2024-01-11

努力寻找或想出一个优雅的答案:

如果我有多个动态反应组件正在侦听一个通量存储以更新其子组件,是否可以发出对特定组件的更改,而不是向注册以侦听该存储上的更改的所有组件发出更改?

例如:动态组件有一个按钮,单击时它会告诉通量存储将一些数据发送到 API。动态组件将根据通量存储发出的响应和更改来更新其子视图。但由于所有动态组件都在监听存储,它们都会更新它们的子视图,这是不期望的行为。理想情况下,通量存储可以识别将更改发送到哪个组件,或者组件可以识别该更改不适合它们。

这可能吗?还是违背了通量原则?


我不知道它是否违反了通量架构,但它似乎没有利用它的一些优点。

简单发出更改(没有更改细节)的优点在于,存储不需要对视图有明确的了解,而且使用 React Virtual Dom 框架,它不应该对性能造成太大影响。

为了进一步优化性能,您可以在React视图上实现shouldComponentUpdate(基于其自身属性的差异),以避免触发tree-diff算法。

看看这个:https://facebook.github.io/react/docs/component-specs.html https://facebook.github.io/react/docs/component-specs.html

==添加更多信息== 在更传统的 MVC 中,模型将发出对特定源和特定细节的更改,例如

this.emit({
    details: { x: 'x', y: 'y' },
    source: objectA
)};

接收此信息的视图(或控制器)需要此类详细信息来更新其 Dom,您将调用update(changes.details)而不是最初的render()方法,因为 Dom 操作的成本很高。

ReactJS 通过另一个虚拟 Dom 层“解决”了这个问题,该层使用纯 Javascript 来计算 Dom 操作中的“最佳”差异,因此在 React 中,你永远不会有方法调用update(),你总会打电话render()基于视图的当前状态,React 会为您进行优化。

因此,将 Flux 与 React 结合使用,您的存储可以发出没有任何细节的更改,并且侦听它的视图可以使用“最佳”Dom 操作进行渲染(因此,如果它的状态尚未更改,则不会有 Dom 操作)。 但当然,你会说在这种情况下 React 仍然会触发虚拟 Dom diff 计算,这仍然会花费一些费用。因此,要进一步优化它,您可以实施shouldComponentUpdate在包含大子树的视图上(基于它自己的状态),以避免 React 运行差异计算。

除了更简单的代码之外,发出简单更改的优点在于 Store 几乎可以与视图解耦。 例如,如果您触发特定视图的特定更改详细信息,那么当视图不再侦听该存储时,您将需要删除或更改存储中的代码。

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

Flux 存储将更改发送到特定的 React 组件而不是所有组件。 的相关文章

随机推荐

  • 使用 Meteor 从单独的文件中调用函数

    我想在 Meteor 中创建一个应用程序 根据我对手册的理解 它首先加载的是 子目录 然后按照字母顺序排列 我的文件结构是这样的 server lib client lib game js gt already starts declari
  • 全文搜索条件“control of”中“of”附近存在语法错误

    我有以下内容WHERE clause WHERE Keywords IS NULL OR CONTAINS p Title p Area p Message Keywords If Keywords control 然后查询执行成功并过滤我
  • 在 WF CodeActivity 和 AsyncCodeActivity 之间进行数据库操作选择

    我对 WF 还很陌生 所以如果我第一次没有正确理解这一点 请耐心等待 如果您在一个相当低容量的环境中 每天几百个请求 对一个规范化良好的数据库进行选择 使用主键 返回单个记录 那么是否使用真的有什么不同吗 CodeActivity vs A
  • 在 EMR Spark 应用程序中加载 props 文件

    我正在尝试使用以下方法在我的 Spark 应用程序中加载自定义属性 command runner jar spark submit deploy mode cluster properties file s3 spark config te
  • 创建可重用的詹金斯管道脚本

    我最近正在考虑使用 Jenkins 管道脚本 一个问题是我没有找到一种明智的方法来创建内部可重用的 utils 代码 想象一下 我有一个通用函数helloworld它将被很多管道作业使用 所以我希望创建一个utils jar可以将其注入到作
  • 在 Swift 中检查字符串是否为字母数字

    在 Swift 中 我如何检查String是字母数字 即 如果它仅包含一个或多个字母数字字符 a zA Z0 9 不包括带变音符号的字母 例如 extension String var isAlphanumeric Bool return
  • .text 与 .data 所需的对齐方式

    我一直在玩弄ELFIO http elfio sourceforge net 图书馆 例子之一 https sourceforge net p elfio code ci master tree examples writer writer
  • 如何将数组复制到特定长度的数组

    我想将一个小数组复制到特定长度的数组 Example var 22 33 44 55 gt len var 4 n 13 我想要的新数组是 var new 22 33 44 55 22 33 44 55 22 33 44 55 22 这是我
  • 如何禁用 Alt 键的正常行为?

    通常 Alt 键会打开 Windows 中的菜单 我需要禁用此功能 因为我的应用程序需要 Alt 键 它是旧计算机的模拟器 所以我需要模仿它的行为 我用纯Windows API编写它 所以我预计一定有一些消息被发送并且需要被禁用 丢弃或忽略
  • 如何获取对刚刚通过操作方法添加的内容的 jQuery 选择器的引用?

    如果使用以下方式将内容添加到 DOM ul append li test li 如何获得刚刚添加的内容的引用而无需选择新添加的内容 分配append 方法的返回值的是jQuery 对象 var newContent ul append li
  • pyLDAvis:尝试使用 BTM 可视化主题时出现验证错误

    我尝试使用生成主题BTM https github com markoarnauto biterm 在尝试可视化主题时 我收到验证错误 我可以在模型训练后打印主题 但使用 pyLDAvis 失败 def btm model num topi
  • 在 Java 中加载/存储文件中的对象

    我想将我的类中的对象存储在文件中 然后才能从该文件加载该对象 但我在某个地方犯了错误 并且不知道在哪里 我可以得到一些帮助吗 public class GameManagerSystem implements GameManager Ser
  • Apache - 将 url 映射到静态内容的本地路径

    我的 httpd conf
  • Lua 中的进程间通信示例?

    为了让它发挥作用 我一直在努力 有人可以提供一个包含 2 个脚本的任意 LUA api 来回传递消息的示例吗 我努力了Oil http webserver2 tecgraf puc rio br maia oil lua ipc https
  • Visual Basic 6.0 的转换工具比较 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 Access 导出不带双引号的 CSV 文件

    我正在尝试从 Access 2010 将表 Final2 导出为 CSV 文件 生成的 CSV 文件带有引号 如何从 CSV 文件中删除引号 我尝试使用 ImportExport Text 宏 该宏的 VBA 代码如下所示 Function
  • 自动布局问题:iOS 7 与 iOS8

    我正在尝试创建一个可折叠的工具栏 其工作方式如下 在 iOS 7 中运行 出于可视化目的 颜色丑陋等 However when I run the code in iOS 8 this is what happens I have set
  • 关于std::add_pointer的实现的一个问题

    From std add pointer https en cppreference com w cpp types add pointer 可能的实施 namespace detail template
  • 更改 momentjs 对象上的事件触发

    对于我的一个项目 我正在监听模型对象的属性更改 并在其属性更改时调用视图方法 问题是我的模型的属性之一是 momentjs 日期对象 我研究了主干源代码 似乎它使用下划线方法触发了设置器中的更改 isEqual 看完之后下划线文档 http
  • Flux 存储将更改发送到特定的 React 组件而不是所有组件。

    努力寻找或想出一个优雅的答案 如果我有多个动态反应组件正在侦听一个通量存储以更新其子组件 是否可以发出对特定组件的更改 而不是向注册以侦听该存储上的更改的所有组件发出更改 例如 动态组件有一个按钮 单击时它会告诉通量存储将一些数据发送到 A