使用Reaction路由6.21.1和新的数据API,我可以设置如下路由:

const routes = [
    {
        element: <RootWrapper/>,
        errorElement: <ErrorWrapper/>,
        children: [
            {path: "/login?", element: <LoginWrapper/>},
            {path: "/logout", element: <Logout/>},
            {
                id: "AuthenticatedRoot",
                element: <AuthenticatedRoot/>,
                children: [
                    // ...
                    {path: "/dashboard", element: <Dashboard/>, loader: fetchDashboard},
                ]
            }
        ]
]

我的仪表板视图24/7全天候显示,每5分钟重新验证一次.它需要通过最多5个错误来提供至少30分钟的发布或其他未知的停机时间.在手动使用useEffects获取数据时,这很简单,因为我可以处理从获取请求返回的错误:

await axios.get('dashboard')
    .then(
        response => {setData(response.data)},
        error => {
            setRetries(origRetries => {
                if (origRetries >= 6) {
                    setError(true)
                    setErrorMessage(error.message)
                    return 0
                } else {
                    return origRetries + 1
                }
            })
        }
    )

有没有办法用新的装载机做这样的事情?

推荐答案

你可以编写你的fetchDashboard加载器函数来关闭重试"状态".实施可能类似于以下内容:

const fetchDashboard = () => {
  let cache = {};
  let retry = 0;

  return async () => {
    try {
      const result = await axios.get('dashboard');

      // Success, cache result and reset retry state
      cache = result;
      retry = 0;

      return result;
    } catch (error) {
      // Failure/error, increment retry count
      retry++;

      if (retry > 5) {
        // Rethrow error if ran out of retries
        throw error;
      } else {
        // Otherwise return cached result
        return cache;
      }
    }
  };
};
const routes = [
  {
    element: <RootWrapper />,
    errorElement: <ErrorWrapper />,
    children: [
      { path: "/login?", element: <LoginWrapper /> },
      { path: "/logout", element: <Logout /> },
      {
        id: "AuthenticatedRoot",
        element: <AuthenticatedRoot />,
        children: [
          // ...
          { 
            path: "/dashboard",
            element: <Dashboard />,
            errorElement: <Dashboard />, // <-- render as error element too!
            loader: fetchDashboard(),    // <-- invoke outer function
          },
        ]
      }
    ],
  },
];
import {
  useRouteError,
  useLoaderData,
  useNavigate,
  useNavigation
} from "react-router-dom";

const Dashboard = () => {
  const navigate = useNavigate();
  const { state } = useNavigation(); // "idle"/"loading", could be handy

  const data = useLoaderData();
  const error = useRouteError();

  // Effect to trigger route revalidation, 5-minute interval
  useEffect(() => {
    const timer = setInterval(() => {
      navigate(".", { replace: true });
    }, 1000 * 60 * 5);
    return () => clearInterval(timer);
  }, []);

  ...

  return (
    ...
  );
};

演示

Edit react-router-v6-4-data-api-retry-loader-without-displaying-error

Javascript相关问答推荐

仅圆角的甜甜圈图表

使用下表中所示的值初始化一个二维数组

. NET中Unix时间转换为日期时间的奇怪行为

如何使覆盖div与可水平滚动的父div相关?

在nextjs服务器端api调用中传递认证凭证

在react JS中映射数组对象的嵌套数据

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

JQuery Click事件不适用于动态创建的按钮

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

如何将未排序的元素追加到数组的末尾?

如何将数组用作复合函数参数?

如何 for each 输入动态设置输入变更值

在FAQ Accodion应用程序中使用React useState时出现问题

将基元传递给THEN处理程序

JWT Cookie安全性

与在编剧中具有动态价值的定位器交互

递增/递减按钮React.js/Redux

递归地将JSON对象的内容上移一级

使用导航时,路径的所有子组件都必须是路径

如何在预览中显示html+css与数据URL?