React Query:Mutation成功后按需重取失效查询的实现问题
问题分析与解决方案
你的需求是Mutation执行成功后,关联依赖的查询全部标记为失效,仅立即重新获取活跃状态的查询,非活跃查询待转为活跃状态时再重取,但当前使用refetchType: 'active'达不到预期,问题出在默认查询配置的refetchOnMount: false。
这个配置会完全禁止所有查询在挂载(从非活跃转为活跃)时触发重取,哪怕数据已经被invalidateQueries标记为失效(stale)。所以非活跃的失效查询在变为活跃时,不会自动发起重取请求。
修正方案
- 调整QueryClient默认配置:将
refetchOnMount改为true,这样当查询挂载时,如果数据处于失效(stale)状态,就会自动重取:
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false, refetchOnMount: true, // 替换原来的false refetchOnReconnect: false, refetchOnWindowFocus: false, }, }, })
- 修改Mutation的失效逻辑:使用
refetchType: 'active'替代all,实现仅立即重取活跃查询:
const useCreateExample = () => { const queryClient = useQueryClient() return useMutation({ mutationFn: createExample, onSuccess: () => { queryClient.invalidateQueries(['example'], { refetchType: 'active' }) }, }) }
效果验证
- Mutation成功后,所有匹配
['example']的查询会被标记为失效 - 当前处于活跃状态的查询会立即触发重取
- 非活跃查询在后续转为活跃(比如组件挂载)时,因为数据已失效且
refetchOnMount: true,会自动发起重取
内容的提问来源于stack exchange,提问作者Mike Kokadii
相关产品推荐
相关产品推荐

