1. 状态管理的优化:
- 使用 React Query 的 useMutation 提供的 mutate 函数可以自动处理异步操作的状态(loading、error、success)
- 通过 onMutate、onError 等回调函数,可以优雅地处理乐观更新和错误回滚
乐观更新(Optimistic Updates):
// ... existing code ...
onMutate: async () => {
await queryClient.cancelQueries({ queryKey });
const previousState = queryClient.getQueryData<LikeInfo>(queryKey);
// 立即更新UI,不等待服务器响应
queryClient.setQueryData<LikeInfo>(queryKey, () => ({
likes: (previousState?.likes || 0) + (previousState?.isLikedByUser ? -1 : 1),
isLikedByUser: !previousState?.isLikedByUser,
}));
return { previousState };
},
// ... existing code ...
- 用户点击后立即看到结果,提供更好的用户体验
- 如果请求失败,可以轻松回滚到之前的状态
3、缓存管理:
-
React Query 自动处理数据缓存
-
通过
queryClient
可以方便地管理和更新缓存数据 -
staleTime: Infinity
确保数据不会自动失效
4、错误处理:
-
内置的错误处理机制
-
可以通过 onError 回调优雅地处理错误情况
-
自动的重试机制
5、代码组织:
-
逻辑清晰,易于维护
-
关注点分离,mutation 逻辑与 UI 渲染分开
-
可复用性强,同样的 mutation 逻辑可以在其他组件中使用
这种写法比传统的手动管理状态(如使用 useState 和 useEffect)要简洁得多,也更不容易出错。它提供了一个声明式的方式来处理服务器状态,同时保持了良好的用户体验。