数据获取规范 (TanStack Query)
为了保持前端状态管理的一致性和可维护性,所有异步数据操作必须遵循以下模式。
1. 钩子封装 (Custom Hooks)
- •所有的
useQuery和useMutation必须封装在src/shared/hooks/目录下的专用文件中(如use-posts.ts,use-categories.ts)。 - •禁止在页面组件(Page)或 UI 组件中直接编写复杂的
queryFn逻辑。
2. 查询键管理 (Query Keys)
- •使用一致的数组格式:
['资源名', '操作/范围', ...标识符]。- •例如:
['posts', 'me', postType](我创作的文章) - •例如:
['posts', 'detail', id](文章详情)
- •例如:
- •这种层次化的 Key 结构便于使用
invalidateQueries进行批量刷新。
3. API SDK 集成
- •必须使用
src/shared/api/generated中自动生成的 SDK 函数。 - •严禁使用原生的
fetch或axios直接调用后端接口(SSR 场景除外,见 ARCHITECTURE.md)。 - •示例:
typescript
queryFn: () => getMyPosts({ query: { post_type: type } })
4. 交互与反馈标准
- •成功反馈: 在
Mutation的onSuccess回调中使用sonner库的toast.success()提供反馈。 - •错误处理: 统一在
onError中使用toast.error()展示后端返回的错误信息。 - •数据同步: 在执行修改操作(Create/Update/Delete)成功后,必须调用
queryClient.invalidateQueries刷新相关的查询缓存。
5. 加载状态
- •在 Page 层级处理整体的
isLoading状态,配合src/components/ui/中的Loader或Skeleton组件。
注意事项
- •尽量通过
Promise链式调用或async/await保持逻辑清晰。 - •对于不经常变动的数据(如文章类型列表),设置适当的
staleTime: Infinity以减少冗余请求。