【问题标题】:How to keep state when receiving server push via websockets?通过 websockets 接收服务器推送时如何保持状态?
【发布时间】:2015-06-15 12:24:17
【问题描述】:

我有一个带有 websockets 的 react/flux 应用程序可以正常工作。所有通信都发生在我的WebSocketUtils 文件中。每当我从服务器接收到新数据作为推送事件时,我都会触发action 并让整个 Flux 流发生。最后导致我的视​​图重新呈现。

各个视图通过Higher Order Components 连接到我的商店。所有新数据都作为道具传递到我的view。由于这些是可变的,我使用这些道具并将它们设置为我的初始状态(which is ok)

现在假设我有用户 A 和用户 B 正在查看我的应用程序的同一个视图(当然是在不同的机器上)。

  1. 用户A编辑了一些数据
  2. 用户B也编辑了一些数据
  3. 用户A 保存此新数据​​
  4. 用户B通过推送事件接收到新数据,视图将重新渲染

问题:用户B丢失了所有已编辑但尚未保存的数据。

任何想法如何解决这个问题?

【问题讨论】:

  • 最重要的问题是用户期望在这种情况下发生什么(当B 有未保存的数据应该由A 更改时)?根据他们的要求,它可能会导致非常复杂的设计。

标签: reactjs flux


【解决方案1】:

用户 WiredPrairie 在他们的评论中是正确的。这不是 React 或 Web Sockets 问题,而是冲突解决问题。

您希望在这种情况下看到什么?您可能希望暂时保留这两种状态,直到您可以自动合并它们(不太可能)或向用户提供某种界面来查看它们的更改。

您还可以提示用户 B 用户 A 正在编辑他们的数据,只是为了让他们了解 :)

精细的编辑方法会有所帮助 - 就像在 Google 电子表格中,用户通常一次只编辑一个单元格,因此在您的情况下,您可能只能通过网络发送字段级信息(而不是记录级信息) ),这将有助于避免冲突。

不过,归根结底,这不是关于特定技术,而是更多关于您的应用程序:您需要确定您希望它的行为方式。

【讨论】:

  • 我认为是关于 React / Flux。 React 想要“单一的事实来源”。随着 websockets 更新状态和用户设置状态,我们现在有两个事实来源。这就是为什么我要问 Flux 是否有某种最佳实践。这也意味着我必须在某处保留来自 websockets 的“真实”状态,并使用用户输入的值保持“假”状态。那不是很漂亮!
  • 问题是,在这个用例中,实际上有两个独立的状态都是“真实的”——服务器上保存的状态,我们希望在客户端应用程序中了解它,以及客户端中的本地状态,服务器不知道,但在用户保存之前它是临时的。我认为将这些作为单独的字段维护没有问题 - 事实上,商店本身可以知道用户是否正在编辑记录并将他们的临时更改与“真实”服务器状态分开。
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 2011-08-17
  • 2023-04-05
  • 1970-01-01
  • 2013-03-31
  • 2017-05-01
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多