我找到了一个名为 nprogress 的库,它可以自动在我的 React 应用程序中显示全局进度条。为此,我需要在导航时进行监听。我从 react-router-dom 中找到了钩子 useNavigation ,它必须在RouterProvider中使用,但 id 不支持子项。我尝试这样做:
import { useEffect } from "react";
import "./App.css";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import HomePage from './HomePage.tsx',
import AboutPage from './AboutPage.tsx'
import {
Route,
Link,
useNavigation,
createBrowserRouter,
createRoutesFromElements,
RouterProvider,
} from "react-router-dom";
const ProgressBarHandler = () => {
const navigation = useNavigation();
useEffect(() => {
if (navigation.state === "loading") {
NProgress.start();
} else {
NProgress.done();
}
}, [navigation.state]);
return null;
};
const router = createBrowserRouter(
createRoutesFromElements(
<>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
</>
)
);
function App() {
return (
<RouterProvider
router={router}
future={{
v7_startTransition: true,
}}
fallbackElement={<ProgressBarHandler />}
/>
);
}
我需要的是让它在导航时启动,因为有时需要几秒钟才能完成渲染一个复杂的页面,并在完成后停止。我发现这useNavigation
真的很酷,因为它还可以自动管理表单操作和许多其他事情。
您对如何使用此钩子或其他钩子来监控导航有什么建议吗?
路由器
fallbackElement
仅在应用程序路由最初加载时进行渲染,此后不再使用。该钩子只能在路由器内的
useNavigation
组件中使用。我建议创建一个根布局路由组件来呈现您的(或直接应用到调用)以及一个嵌套路由。ProgressBarHandler
useEffect
NProgress
Outlet
例子:
仅凭这一点还不足以使加载指示器正常工作。
获取导航操作加载指示器的技巧是:
添加路由加载器,以便
navigation.state
可以实际更新"loading"
状态值。这是因为加载状态仅当重点是我的。
重新验证每条路线变更。默认情况下,仅在特定条件下调用或重新验证路线加载器:
有关详细信息,请参阅shouldRevalidate。再次强调,重点是我。
将所有这些放在一起,你会得到如下结果:
注意:我删除了 `v7_startTransition` 未来标志,因为这似乎会干扰路线转换和您想要使用的 `NProgress` UI。此标志用于:演示