演示:
QQ20240304-045116-HD.mp4
这个最好理解,根据表单提交状态,获取状态中的数据和等待状态,唯一需要注意的是它必须被<form>
包裹,不能在同一层级也不能是<form>
的父级
演示代码:
const [optimisticMessage, addOptimisticMessage] = useOptimistic(
data.map(message => ({ sending: false, message })),
(state, message: string) => [...state, { sending: true, message }],
);
将它和useStatus
作为比较来理解,相同点:
- 都返回一个数组参数,包含有:第一个是当前的状态,第二个是更新方法
hook
本身接受的第一个参数均为初始值
不同点:
useStatus
一旦赋予初始值后,将不再接受初始值的更新,必须通过返回的数组中的更新方法来更新useOptimistic
接受初始值每一次的更新之外,也接受来自返回的数组中的更新方法来更新- 除此之外
useOptimistic
还接受一个函数作为第二个参数,用于作为乐观更新的规则
注意点:
useOptimistic
返回的更新方法只能通过form
的action
触发action
之外触发更新,需要包裹startTransition
,这也是为什么初始值是通过下面代码来设置
useEffect(() => {
startTransition(() => {
data.length === 0 && submitHandle("first message", true);
});
}, [data, submitHandle, startTransition]);
注意点:
cookies
只能在服务端组件中使用- 除了查询以外其他操作均需要在
server action
中进行