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

React Query错误边界:如何根据错误展示次数为用户提供不同操作选项

问题根源

你的alreadyTriedItOnce状态存储在PageError组件内部,每次错误边界重置后,PageError会被卸载,下次错误边界触发重新渲染PageError时,内部状态会被初始化为false,导致按钮切换逻辑失效。

解决方案

将重试标记存储在不会被错误边界重置销毁的上下文里,这里推荐直接用react-query的queryClient全局存储临时状态,无需额外引入状态管理库,实现逻辑如下:

1. 修改ButtonInvalidateAuthQueries点击逻辑

先保存重试标记,再重置错误边界,同时等待查询失效操作执行完成,避免时序问题:

const ButtonInvalidateAuthQueries: React.VFC<MyProps> = (
  { resetErrorBoundary }: MyProps,
) => {
  const queryClient = useQueryClient();
  return (
    <IonButton
      onClick={async () => {
        // 等待认证相关查询失效完成
        await queryClient.invalidateQueries(queryKeyInvalidateAllAuthQueries);
        // 存储重试标记到queryClient全局状态
        queryClient.setQueryData(['auth-retry-attempted'], true);
        resetErrorBoundary();
      }}
    >
      Reset auth queries
    </IonButton>
  );
};

2. 修改PageError组件的状态初始化逻辑

从queryClient读取重试标记作为初始值,点击重置应用按钮时清除标记:

const PageError: React.VFC<MyProps> = ({ errorMessage, resetErrorBoundary }: MyProps) => {
  const queryClient = useQueryClient();
  // 从全局状态读取重试标记,默认值为false
  const [alreadyTriedItOnce, setAlreadyTriedItOnce] = useState(
    () => queryClient.getQueryData(['auth-retry-attempted']) ?? false
  );

  const handleResetApp = () => {
    // 重置时清除重试标记,下次报错恢复显示第一个按钮
    queryClient.removeQueries(['auth-retry-attempted']);
    // 原有登出、重置查询逻辑
  };

  return (
    <IonPage>
      <IonContent>
        { alreadyTriedItOnce ? (
          <ButtonResetApp 
            platform={platform} 
            resetErrorBoundary={resetErrorBoundary}
            onReset={handleResetApp}
          />
        ) : (
          <ButtonInvalidateAuthQueries
            resetErrorBoundary={resetErrorBoundary}
          />
        )}
      </IonContent>
    </IonPage>
  );
};

替代方案

如果不想占用queryClient的存储位,也可以用sessionStorage存储重试标记,读写逻辑和上面一致,用户关闭页面后标记会自动清除,不会有残留问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:15:03