You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RTK Query中第二次调用personDataSend时isLoading不生效问题

RTK Query useLazyQuery isLoading 二次点击不更新的解决办法

问题核心:RTK Query的useLazyQuery默认会缓存请求结果,当传入相同参数发起第二次请求时,会直接返回缓存数据,不会触发新的网络请求,因此isLoading状态不会再次变为true。

以下是几种可行的解决办法:

  • 强制每次请求都重新发起
    在调用getDriverLicenseByPin时,传入forceRefetch: true选项,强制跳过缓存触发新请求,这样每次点击都会更新isLoading状态:

    const personDataSend = (values) => {
      getDriverLicenseByPin({
        pin: values.Pin,
        driverLicenseNumber: values.DriverLicenseNumber,
      }, { forceRefetch: true });
    };
    
  • 设置缓存立即失效
    在定义API切片时,给该查询配置keepUnusedDataFor: 0,让缓存数据立即失效,确保下次请求一定会重新发起:

    // 示例:API切片定义片段
    export const yourApiSlice = createApi({
      reducerPath: 'yourApi',
      baseQuery: fetchBaseQuery({ baseUrl: '/' }),
      endpoints: (builder) => ({
        getDriverLicenseByPin: builder.query({
          query: (params) => `/driver-license?pin=${params.pin}&number=${params.driverLicenseNumber}`,
          keepUnusedDataFor: 0, // 缓存立即过期
        }),
      }),
    });
    
  • 手动调用refetch方法
    从useLazyQuery的返回值中解构出refetch方法,在触发查询后手动调用它来刷新请求:

    const [
      getDriverLicenseByPin,
      { data, isLoading, refetch },
    ] = useLazyGetDriverLicenseByPinQuery();
      
    const personDataSend = (values) => {
      getDriverLicenseByPin({
        pin: values.Pin,
        driverLicenseNumber: values.DriverLicenseNumber,
      });
      refetch();
    };
    

内容的提问来源于stack exchange,提问作者Ishaq Yaqublu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:03