360 Secure SkillHub
360 安全技能中心

Data Fetching

提供前端服务端状态获取与缓存的规范:类型化查询、缓存键设计、变更失效、乐观更新回滚、无限查询、预取与SSR水合,可基于TanStack Query/SWR实现。典型场景为列表/详情请求、分页无限滚动、提交后刷新缓存、SSR/SSG预取。输入为查询键与API纯函数,输出带loading/error/empty/data状态的hook及清晰的API/UI分层。不适用于本地UI状态。

bovinphang
bovinphang
热度 54.62
最近更新 2026-09-26 22:58:06
分类:开发依赖:读写文件应用场景:代码生成 / API 集成

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add fec-data-fetching
Metadata
name
fec-data-fetching
description
Use when implementing or reviewing frontend server-state flows: typed queries, request caching, invalidation, mutations, optimistic updates, infinite queries, prefetch, SSR hydration, or API-layer integration. Do not use for local UI state or Service Worker caching; Chinese triggers include data fetch, cache, optimistic updates.

Server State data acquisition

Purpose

Establish clear data acquisition, caching, invalidation and submission boundaries for front-end server state to avoid request state being scattered among page components.

Procedure

  1. Determine the source of the state: use the request caching scheme when it comes from the server and needs caching, deduplication, refreshing, paging or mutation; use component state or store for purely local UI state.
  2. First use the existing data acquisition library of the project; when adding dependencies, you can consider TanStack Query for React/Vue/Solid/Svelte, or you can also use SWR, Nuxt/Nitro data acquisition or project encapsulation.
  3. Stable design cache key/query key: The structure contains entities, actions and all parameters that affect the results.
  4. The API function remains a pure request function, and the data hook/composable is responsible for cache, select, loading/error/empty status.
  5. Invalidation after mutation succeeds; use optimistic update when immediate feedback is needed and rollback when failure occurs.

React Quick Start

import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";

export function UserList({ keyword }: { keyword: string }) {
  const query = useQuery({
    queryKey: ["users", "list", { keyword }],
    queryFn: () => getUserList({ keyword, page: 1, pageSize: 20 }),
    select: (response) => response.list,
  });

  if (query.isLoading) return <Skeleton />;
  if (query.isError) return <ErrorFallback onRetry={() => query.refetch()} />;
  if (!query.data?.length) return <EmptyState />;

  return query.data.map((user) => <UserRow key={user.id} user={user} />);
}

export function useCreateUser() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: createUser,
    onSuccess: () => queryClient.invalidateQueries({ queryKey: ["users"] }),
  });
}

Detailed reference

Load references/query-patterns.md when it comes to whether you need a query library, QueryClient default configuration, Vue adapter, optimistic updates, infinite scroll queries, prefetching, SSR hydration, and API layer integration.

Constraints

  • The same data must reuse the same cache key/query key; missing parameters will cause cache string reading.
  • If staleTime is too long, old data will be displayed, and if it is too short, it will cause frequent requests.
  • The request cache library does not manage local UI state; do not put modal and input box values into the query cache.
  • Optimistic updates must save snapshots and rollback on failure.
  • SSR/SSG scenarios must use framework-supported prefetching, hydration, or server-side data boundaries.

Expected Output

The data acquisition layer has loading/error/empty/data status, repeated requests are automatically deduplicated, the cache is correctly invalidated or rolled back after mutation, and the boundary between the API layer and the UI layer is clear.