使用 useOptimistic 实现即时反馈
使用 useOptimistic 在服务器变更进行期间显示乐观界面更新。
使用 useOptimistic 实现即时反馈 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
欢迎
在本课中,您将使用 React 19 的 useOptimistic 钩子,在服务器变更操作进行期间显示即时的乐观界面变化,并在失败时自动回滚。
什么是乐观界面?
乐观界面指的是假设服务器变更操作会成功,不等待服务器响应就立即更新界面。如果操作失败,则回滚到之前的状态。
useOptimistic 基础
useOptimistic 接收实际状态和一个更新函数,并返回乐观状态以及应用乐观更新的函数。
'use client';
import { useOptimistic } from 'react';
const [optimisticLikes, addOptimisticLike] = useOptimistic(
likes, // actual state from server
(state, newLike) => [...state, newLike] // how to apply optimistic update
);点赞按钮示例
用户点击 Like 时,通过 addOptimisticLike 立即在界面中显示新的点赞,然后发送实际请求。如果请求失败,乐观状态会自动恢复为实际状态。
async function handleLike() {
addOptimisticLike({ id: Date.now(), user: currentUser });
await likePost(postId); // server action
}乐观状态存放在哪里
在过渡期间,optimisticLikes 会显示乐观值。服务器响应后,实际的 `likes` 状态通过重新验证得到更新,useOptimistic 会自动将其同步回实际状态。
乐观项目的等待指示器
请用视觉方式标记乐观项目(例如使其稍微变暗),让用户知道它们正在等待处理。您可以在乐观更新中添加 `pending: true` 标志,并据此设置样式。
const [optimisticMessages, addOptimistic] = useOptimistic(
messages,
(state, msg) => [...state, { ...msg, pending: true }]
);
// Render
{optimisticMessages.map(m => (
<div key={m.id} style={{ opacity: m.pending ? 0.6 : 1 }}>{m.text}</div>
))}在过渡中使用
useOptimistic 只能在 React 过渡(startTransition 或 useTransition)中使用。在 React 19 中与服务器操作结合使用时,这一过程会自动处理。
'use client';
import { startTransition } from 'react';
const handleSubmit = (data) => {
startTransition(async () => {
addOptimistic(data);
await serverAction(data);
});
};发送聊天消息示例
在服务器保存消息期间,立即将已发送的消息显示在聊天列表中。消息会立即出现,并显示“发送中……”状态;服务器确认后,再切换为“已发送”。
错误回滚行为
如果服务器操作失败(抛出错误或被拒绝),useOptimistic 会自动丢弃乐观值,并恢复到上一个实际状态。您不需要手动实现回滚。
useOptimistic 与手动乐观更新
在 useOptimistic 出现之前,您需要管理两个状态变量(实际状态和乐观状态),并在 catch 代码块中手动回滚。useOptimistic 将这些工作整合到一个钩子中,并自动执行回滚。
快速检查
如果触发乐观更新的服务器操作失败,乐观状态会发生什么?
回顾
useOptimistic(actualState, updater) 返回 [optimisticState, addOptimistic]。请在服务器操作之前调用 addOptimistic,以获得即时反馈。如果操作失败,React 会自动恢复状态。它必须在 React 过渡中使用。
课程完成
恭喜您!您已完成 **服务器组件与 React 19 功能**。现在,您已经了解 RSC、use() 钩子、Actions、useActionState,以及用于现代 React 开发的 useOptimistic。
常见问题解答
「使用 useOptimistic 实现即时反馈」课时是免费的吗?
是的 — 「使用 useOptimistic 实现即时反馈」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「使用 useOptimistic 实现即时反馈」这节课中我会学到什么?
使用 useOptimistic 在服务器变更进行期间显示乐观界面更新。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 useOptimistic 实现即时反馈」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- React Server Components 详解
- 使用 use() 钩子读取异步资源
- React Actions 与 useActionState
- 使用 useOptimistic 实现即时反馈