更新数据更改的 UI

Posted

技术标签:

【中文标题】更新数据更改的 UI【英文标题】:Update UI on Data change 【发布时间】:2021-08-14 02:53:01 【问题描述】:

(我主要使用 Vue.js,所以很多例子都与它相关)

我正在学习构建 Web 应用程序,最耗时的事情是 UI 组件和它们应该表示的数据的同步,即显示给用户的内容与存储在内存中的内容之间的一致性(本地)。

例如,假设我有以下组件树:

<body>
    <form/>
    <task-bar/>
    <component-1>
    <component-2>
</body>

这里的父组件是body,它有四个子组件,分别是form、task-bar、component-1和component-2。

我们有一个对象列表,例如:

[

   id: 1,
   title: "X"
,

    id: 2,
    title: "Y"

]

任务栏列出组件标题。

Component-1 显示通过单选按钮在 Component-2 中选择的对象。

现在,我想在表单中添加一个对象到列表中或编辑/删除 Component-2 中选定的组件。

在 Vue.js 中,我会将列表从父组件传递给其子组件,但是,默认情况下,父组件和兄弟组件不会对子组件和兄弟组件的数据进行反应。因此,兄弟对列表的更改会在所有组件之间创建不连贯的状态。

我阅读了两种解决方法,首先是使用事件,孩子做一些事情并通知(这是我以前在 Java Swing 中所做的,一种观察者模式),但是在一些事件之后变得非常麻烦,此外,它很难调试,您可能会在不同的组件中重复事件代码。

第二种方式是使用全局状态,例如 Vuex 中实现的 Flux 模式。然而,这会将所有组件耦合到特定项目的 Vuex 并使其不那么可移植。

我的问题是,这是两种独特的做事方式吗?我做错了吗?

【问题讨论】:

【参考方案1】:

您还可以执行以下操作之一:

使用一个变量就像它是一个全局状态。你在 Vue 的文档中有一个这样的例子:https://vuejs.org/v2/guide/state-management.html 在您的组件中,使用 $parent.doSomething(),其中 doSomething() 是您父组件的方法。

但就个人而言,我喜欢 vuex :)

【讨论】:

以上是关于更新数据更改的 UI的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 从不同的集合中获取数据,并在数据更改时更新 UI

数据更改时如何更新 UI?

核心数据 - 在对象中的多对关系更改属性后更新 UI

Kendo UI:更新一列数据以更改另一列中的值

RxSwift Observeable 不会在数据更改时更新 tableview

WPF DataGrid - 如何暂停数据绑定中的 UI 更新并稍后进行批量更新