帮助设计请求封装、错误与 Loading/空态、缓存与数据流。
要点做法基地址与超时axios/fetch 实例:baseURL、timeout、拦截器鉴权请求头注入 token;401 统一跳登录或刷新 token取消页面卸载或路由离开时取消未完成请求(AbortController)重试对幂等接口或 GET 可有限重试;指数退避可选
层级做法请求层网络错误、超时、4xx/5xx 转成统一错误格式业务层按 code 或 status 分支:未登录、无权限、业务错误文案UI 层全局 toast/message 或页面级 error 区;关键操作可弹窗确认
状态做法Loading首屏骨架或 spinner;列表「加载更多」用局部 loading空数据空列表/空搜索用插画+文案+操作引导失败错误文案+重试按钮;可区分网络错误与业务错误
场景做法列表分页参数、拉取后追加或替换;下拉刷新/上拉加载详情进入页拉取;离开可保留一段时间再失效(如 React Query staleTime)实时性短 staleTime + 窗口 focus 时 refetch;或 WebSocket 推送
规模建议简单组件内 useState + useEffect 请求;状态提升到父组件即可多页共享Context + 请求函数 或 React Query/SWR 等复杂全局 store(Zustand/Redux)+ 异步 thunk/saga 或 React Query 做服务端状态
用户说「接口封装」「请求」这类词时,先判断他们真正卡在哪:
用户描述实际问题第一步「接口怎么封装」「请求层怎么写」从零设计请求层问:用 axios 还是 fetch?有没有现成的拦截器?鉴权方式是什么?「loading 怎么做」「空态怎么处理」UI 状态管理直接给出该场景的状态机模型和代码示例「接口报错了」「401 没处理」具体 bug问:错误在哪一层出现的?是请求层还是业务层?「用 React Query 还是 SWR」选型决策问:项目规模、是否有 SSR、团队熟悉度,然后给出明确推荐「缓存怎么做」缓存策略问:哪类数据需要缓存?实时性要求是什么?
不要一上来就把所有维度都输出,先定位用户卡在哪一层。
从零设计请求层时,按这个顺序问清楚再给方案:
信息齐了,给出完整的实例配置 + 拦截器代码,不要只给原则。
处理具体状态问题时,直接给代码,不要先讲理论:
isLoading/isError/data 用法useInfiniteQuery 或手写分页 hook 的完整示例选型问题时,给明确结论:
方案给完后,自查这几个点是否覆盖:
有遗漏的主动补上,不要等用户问。
markdown
## 接口与数据层方案
### 请求封装
- 实例:baseURL、timeout、拦截器
- 鉴权/取消/重试:…
### 错误处理
- 分层:请求层 / 业务层 / UI 层
- 文案与重试:…
### Loading 与空态
- 首屏/列表/详情:…
- 空数据/失败:…
### 缓存与数据流
- 列表/详情:…
- 工具:React Query / SWR / 自管理