如何以通量模式存储对象更新视图

Posted

技术标签:

【中文标题】如何以通量模式存储对象更新视图【英文标题】:How stores objects update view in flux pattern 【发布时间】:2017-09-14 10:20:39 【问题描述】:

假设我们有一个聊天应用程序并且对话页面已经打开。如果由其他用户编辑的消息之一或消息的状态从已发送更改为已发送,Action 使用新消息元数据更新 Store。例如,在这些操作之后,我们在 Store 中有一个 messagesState 或 messagesText 列表,或者只是带有修改数据的消息。所以在这种情况下,我们不知道哪一行被编辑了,我们再次在视图中渲染所有数据。这种行为是通量原则之一吗?只更新和发送关于更新对象的事件不是更好吗?

(我正在开发 android 应用程序,所以我不使用 reactJS 或其他类似的库)

另外,我认为如果我们将 MVP 与 Flux 混合使用会很好!因为如果一个视图想要改变自己,我们必须将逻辑放在视图中。例如视图直接获取存储数据并检查它属于哪个元素!我认为演示文稿布局适合这种情况。有人试过吗?

【问题讨论】:

【参考方案1】:

所以在这种情况下,我们不知道哪一行已被编辑,我们再次在视图中呈现所有数据。这种行为是 Flux 原则之一吗?

是的,是的! Flux 原则之一是数据的不变性,以避免对父数据结构中的每个对象进行增量更改处理。这也立即回答了您的第二个问题:

只更新和发送关于更新对象的事件不是更好吗?

有很多用于您的 Android 项目的帮助程序库来建立不可变的数据结构。仅举几例:

https://github.com/immutables/immutables https://github.com/konmik/solid

相比之下,ReactJS 只能通过将当前 DOM 树与待更新的 DOM 树进行比较来对“UI-Layer”即 DOM 执行更新,因此可以执行增量更新。 你可以在你的 Android 视图中模仿这种行为,通过为你的视图实现类似于 ReactJS 的shouldComponentUpdate() 函数的东西。

【讨论】:

以上是关于如何以通量模式存储对象更新视图的主要内容,如果未能解决你的问题,请参考以下文章

通量存储中的异步数据加载

Flux 设计模式 - 关于视图概念的歧义

关于多功能应用程序的状态与通量存储的问题

结合 ORM、工作单元和存储库模式的主从视图

如何在视图中设置和调用 rails 方法来更新对象的属性

SwiftUI如何在更新已发布数组中的对象而不是数组本身时更新视图