TanStack React Query v5:如何重新获取/失效非活跃查询?
解决TanStack React Query v5中重置/重新获取Disabled查询的问题
在React Query v5中,enabled: false的查询不再被归类为inactive状态,而是单独划分成了disabled状态。这就是你设置type: "inactive"或"all"都无法匹配到目标查询的核心原因——v4中enabled: false属于inactive范畴,但v5拆分了这两类状态的划分逻辑。
具体解决方案
1. 重置Disabled查询(resetQueries)
使用predicate函数精准匹配disabled状态的查询:
<button type="button" onClick={() => qc.resetQueries({ queryKey: ['repoData'], // 匹配状态为disabled的目标查询 predicate: (query) => query.state.status === 'disabled' }) } > Click to refetch all queries </button>
如果需要同时覆盖inactive和disabled状态的查询,调整predicate逻辑即可:
predicate: (query) => query.state.status === 'disabled' || query.state.status === 'inactive'
2. 重新获取Disabled查询(refetchQueries)
如果你的目标是直接触发查询执行而非重置,可以使用refetchQueries并开启includeDisabled选项:
<button type="button" onClick={() => qc.refetchQueries({ queryKey: ['repoData'], includeDisabled: true }) } > Click to refetch all queries </button>
修改后的完整Example.tsx示例
import { useQuery, useQueryClient } from '@tanstack/react-query'; export function Example() { const qc = useQueryClient(); const { isLoading, error, data } = useQuery({ queryKey: ['repoData'], // v5推荐使用数组形式的queryKey,更符合规范 queryFn: () => { return fetch( 'https://api.github.com/repos/tannerlinsley/react-query' ).then((res) => res.json()); }, enabled: false, }); if (!data) { return ( <button type="button" onClick={() => qc.resetQueries({ queryKey: ['repoData'], predicate: (query) => query.state.status === 'disabled' }) } > Click to refetch all queries </button> ); } if (isLoading) return 'Loading...'; if (error) return 'An error has occurred: ' + error.message; return ( <div> <h1>{data.name}</h1> <p>{data.description}</p> <strong>👀 {data.subscribers_count}</strong> {' '} <strong>✨ {data.stargazers_count}</strong> {' '} <strong>🍴 {data.forks_count}</strong> </div> ); }
内容的提问来源于stack exchange,提问作者Miremad Bagheri
相关产品推荐
相关产品推荐

