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

RTK Query离线状态提示及联网自动重取数据方案咨询

问题解决:RTK Query 离线状态提示与联网自动重取

一、离线状态展示提示信息

原代码仅处理了加载中、有数据、空数据三种场景,但**请求失败(如离线断网)**时,isLoading会变为false,且data为空,此时因缺少错误状态判断导致页面空白。

修改Cart.tsx代码,补充错误状态处理:

const ShoppingCart: React.FC<Props> = ({}) => {
  const user_id = useSelector((state: RootState) => state.Auth.user.user_id);

  // 解构获取错误状态相关属性
  const { data, isFetching, isLoading, error, isError } = useCartQuery({user_id});

  // 加载中(首次请求/重取请求)展示Loader
  if(isLoading || isFetching) {
    return <Loader />
  } 
  // 请求失败(含离线)展示提示
  else if(isError) {
    return <div>当前网络异常,请检查连接后重试</div>
  }
  // 有购物车数据时渲染组件
  else if(data && data.length > 0) {
    return <ShoppingCartComponent products={data} />
  } 
  // 购物车为空时展示空状态
  else if(data && data.length === 0) {
    return <ShoppingCartEmpty />
  }
  // 兜底异常提示
  else {
    return <div>加载失败,请稍后重试</div>
  }
}

export default ShoppingCart;

注:将isFetching加入加载判断,可在后续自动重取时展示加载状态。

二、联网后自动重新获取数据

RTK Query默认不监听网络状态变化,可通过以下两种方式实现联网自动重取:

方案1:使用RTK Query内置配置(推荐)

在fetchBaseQuery中开启refetchOnReconnect,联网时自动重发所有失败的请求:

reducerPath: 'ShoppingCartApi',
baseQuery: fetchBaseQuery({ 
  baseUrl: `${API_ENDPOINT}/`,
  refetchOnReconnect: true // 开启联网自动重取
}),
tagTypes: ['CART'],
endpoints: (builder) => ({
  cart: builder.query<IProduct[], { user_id?: number; unlogged_uuid?: string; }>({
    query: (data) => ({
      url: '/cart',
      method: 'POST',
      body: data
    }),
    providesTags: ['CART']
  }),

也可仅给单个query配置refetchOnReconnect: true,实现局部重取控制。

方案2:手动监听网络状态(自定义场景)

若需更精细的控制逻辑,可在组件中监听online事件触发重取:

const ShoppingCart: React.FC<Props> = ({}) => {
  const user_id = useSelector((state: RootState) => state.Auth.user.user_id);

  const { data, isFetching, isLoading, error, isError, refetch } = useCartQuery({user_id});

  useEffect(() => {
    const handleOnline = () => refetch();
    window.addEventListener('online', handleOnline);
    return () => window.removeEventListener('online', handleOnline);
  }, [refetch]);

  // 渲染逻辑同方案1
}

关键说明

  • isLoading仅在首次请求初始化时为true,后续重取请求需用isFetching判断加载状态
  • 可通过error.status等属性进一步区分离线、服务器错误等不同失败场景
  • 内置refetchOnReconnect配置适合通用场景,手动监听则更灵活可控

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:01:09