如何禁止React Query在调用searchEmployee函数前发起API请求?
解决React Query仅在调用searchEmployee时发起API请求的问题
要禁止React Query在组件挂载后自动发起请求,只在调用searchEmployee时触发,核心是利用React Query的enabled配置项,或者手动调用refetch方法,以下是几种可行方案:
方案1:基于搜索参数有效性启用自动请求
通过判断搜索参数value是否为有效状态,控制useQuery是否自动发起请求:
const [value, setValue] = useState<EmployeeType>({ id: 0, name: "" }) const { isLoading, isError, isSuccess, data: employees, error, refetch } = useQuery({ queryKey: ['employees', value], queryFn: () => fetchEmployee(value), // 仅当id不为默认的0且name不为空时,才允许自动发起请求 enabled: value.id !== 0 && value.name !== "" }) const searchEmployee = ((params: any) => { const newValue: EmployeeType = { id: params.ic, name: params.passport } setValue(newValue) })
原理:enabled默认为true,会在组件挂载时自动执行queryFn。将其设置为基于value的判断条件后,初始状态下条件不满足,useQuery不会发起请求;当调用searchEmployee设置有效参数后,条件成立,React Query会自动触发API请求。
方案2:用独立状态标记搜索触发
如果需要更明确的触发控制,可以新增一个状态变量标记是否发起过搜索:
const [value, setValue] = useState<EmployeeType>({ id: 0, name: "" }) // 标记是否已触发搜索 const [isSearchInitiated, setIsSearchInitiated] = useState(false) const { isLoading, isError, isSuccess, data: employees, error, refetch } = useQuery({ queryKey: ['employees', value], queryFn: () => fetchEmployee(value), enabled: isSearchInitiated }) const searchEmployee = ((params: any) => { const newValue: EmployeeType = { id: params.ic, name: params.passport } setValue(newValue) // 标记已触发搜索,让useQuery开始工作 setIsSearchInitiated(true) })
原理:初始isSearchInitiated为false,useQuery处于禁用状态;调用searchEmployee时将该状态设为true,useQuery自动发起请求。后续如果修改搜索参数,只要queryKey变化,React Query会自动重新请求。
方案3:完全手动调用refetch
如果需要完全掌控请求时机,可以将enabled设为false,然后在searchEmployee中手动调用refetch:
const [value, setValue] = useState<EmployeeType>({ id: 0, name: "" }) const { isLoading, isError, isSuccess, data: employees, error, refetch } = useQuery({ queryKey: ['employees', value], queryFn: () => fetchEmployee(value), // 禁用自动请求,完全手动控制 enabled: false }) const searchEmployee = async ((params: any) => { const newValue: EmployeeType = { id: params.ic, name: params.passport } setValue(newValue) // 手动触发API请求 await refetch() })
原理:enabled: false会彻底关闭useQuery的自动请求逻辑,只有当手动调用refetch时才会发起请求。这种方式适合需要在请求后立即处理结果(比如等待请求完成再执行后续操作)的场景。
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

