0Pricing
React Academy · 课时

手动实现乐观更新

在本地应用乐观状态、将变更加入队列,并明确处理成功和失败情况

手动实现乐观更新 是 CoddyKit 上的免费 React Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

变更操作前的状态

手动实现乐观式更新时,应先使用服务器数据初始化本地组件状态:const [items, setItems] = useState(serverItems)。您要渲染的是这个本地状态,进行乐观式变更的也是这个状态。请勿直接修改从服务器获取的数据——应保留一份由您控制的本地副本。

执行乐观式更新

当用户触发变更操作(点击“添加”“点赞”或“删除”)时,请在调用应用程序接口之前立即更新状态:setItems(prev => [...prev, newItem])。界面会即时反映变化。只有完成这次更新后,才发送实际的网络请求。

保存之前的状态

执行乐观式更新之前,请保存当前状态:const previousItems = items。这个快照就是回滚目标。如果应用程序接口调用失败,您可以恢复这个值。请将它存储在变量中,而不是状态中,因为您只需要在变更操作等待完成期间使用它。

发起应用程序接口调用

完成乐观式更新后,异步发起应用程序接口调用,并将其包装在 try/catch 中。成功时,您可以选择重新获取数据以便与服务器状态同步,也可以在服务器会返回相同数据的情况下直接信任乐观式状态。失败时,请使用之前保存的状态进行回滚。

失败时回滚

在变更操作的 catch 代码块中执行:setItems(previousItems)。这会将状态恢复到乐观式更新之前的状态。回滚后请显示错误通知。用户能够理解偶尔发生的失败,但无法接受的是界面无提示地处于不一致状态。

失败时显示错误提示

回滚后,请显示错误消息:“无法保存更改,请重试。”并提供一个“重试”按钮,用于再次触发相同的变更操作。这样可以让用户掌握主动权。回滚、错误提示和重试结合起来,就能在不阻塞整个界面的情况下妥善处理失败情况。

临时 ID 问题

以乐观方式添加新项目时,服务器还没有为它分配真实 ID。请为这个乐观式项目创建一个临时 ID:const tempId = crypto.randomUUID()。将其用作列表中该项目的键。应用程序接口成功响应后,再将临时 ID 替换为服务器分配的真实 ID。

协调临时 ID

创建变更操作成功后,服务器会返回真实 ID。请更新状态,替换临时项目:setItems(prev => prev.map(item => item.id === tempId ? { ...item, id: serverResponse.id } : item))。这种协调过程可以确保后续操作使用正确的服务器 ID。

竞态条件问题

如果用户在短时间内连续触发两次变更操作,响应可能会乱序到达。第二次变更操作的响应可能先于第一次到达,而第一次操作的回滚可能会覆盖第二次操作产生的正确状态。这是乐观式界面特有的一种竞态条件。

通过串行化变更防止竞态

解决竞态条件的一种方法是使用队列将变更操作串行化。变更进行期间,请禁用触发按钮(将 isSubmitting 状态设为启用)。只有在上一次变更完成后,才允许执行下一次变更。这会牺牲一些响应速度,但能保证状态顺序正确。

乐观删除模式

对于删除操作:先捕获之前的项目列表,从状态中过滤掉要删除的项目,调用删除接口,并在失败时回滚。删除比创建更简单(不需要协调 ID),但适用的原则相同。您可以考虑在调用接口前短暂延迟删除操作,并显示一个“撤销”选项。

乐观更新中的临时 ID

为什么乐观添加的项目需要临时 ID?

课程回顾:手动乐观更新

手动模式:捕获 previousItems,使用 setItems 设置新状态,调用接口,并在失败时使用 setItems(previousItems) 回滚,同时显示错误。添加项目时,使用 crypto.randomUUID() 作为临时 ID,并在成功后将其与服务器 ID 对应起来。在变更进行期间禁用触发器,以防止竞态条件。回滚 + 提示消息 + 重试是标准的失败交互方式。

常见问题解答

「手动实现乐观更新」课时是免费的吗?

是的 — 「手动实现乐观更新」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「手动实现乐观更新」这节课中我会学到什么?

在本地应用乐观状态、将变更加入队列,并明确处理成功和失败情况 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「手动实现乐观更新」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是乐观界面,以及何时使用
  2. 手动实现乐观更新
  3. 错误回滚与冲突解决
  4. 使用 React Query 和 Zustand 的乐观模式
← 返回 React Academy