在 Next.js 中,当页面切换时添加加载 loading 指示器可以使用几种不同的方法。以下是几个步骤和示例,说明如何实现这一功能:
使用路由事件监听
Next.js 的 Router
对象提供了路由事件,可以在路由开始和结束时触发函数。我们可以利用这些事件来展示和隐藏一个加载指示器。
jsximport { useState, useEffect } from 'react'; import Router from 'next/router'; import NProgress from 'nprogress'; // 这是一个轻量级的进度条库 // 在组件内部可以这样使用: function MyApp({ Component, pageProps }) { const [loading, setLoading] = useState(false); useEffect(() => { const handleStart = () => setLoading(true); // 开始导航时设置加载状态 const handleComplete = () => setLoading(false); // 完成导航时解除加载状态 Router.events.on('routeChangeStart', handleStart); Router.events.on('routeChangeComplete', handleComplete); Router.events.on('routeChangeError', handleComplete); // 加载发生错误时也解除加载状态 return () => { Router.events.off('routeChangeStart', handleStart); Router.events.off('routeChangeComplete', handleComplete); Router.events.off('routeChangeError', handleComplete); }; }, []); return ( <div> {loading && ( <div className="loader">Loading...</div> // 这里可以自定义加载指示器的样式 )} <Component {...pageProps} /> </div> ); }
使用 nprogress
库可以使得加载指示器看起来更加专业和平滑。它会在页面顶部显示一个细长的进度条。使用时,你需要引入 nprogress
的样式文件,这通常在你的 styles.css
文件或者是 App
组件中完成。
jsx// 在 _app.js 或者其他全局组件中: import NProgress from 'nprogress'; import 'nprogress/nprogress.css'; // 这是 nprogress 的默认样式 import Router from 'next/router'; NProgress.configure({ showSpinner: false }); // 你可以选择关闭加载旋转器 Router.events.on('routeChangeStart', () => NProgress.start()); Router.events.on('routeChangeComplete', () => NProgress.done()); Router.events.on('routeChangeError', () => NProgress.done());
使用自定义的 App 组件
自定义的 App 组件能够在路由变化时增加一个全局的加载状态。这里的原理和使用路由事件监听类似,但是它让你能够更容易地管理状态和传递 props。
jsximport App from 'next/app'; import NProgress from 'nprogress'; import Router from 'next/router'; class MyApp extends App { constructor(props) { super(props); this.state = { loading: false }; Router.events.on('routeChangeStart', () => { this.setState({ loading: true }); NProgress.start(); }); Router.events.on('routeChangeComplete', () => { this.setState({ loading: false }); NProgress.done(); }); Router.events.on('routeChangeError', () => { this.setState({ loading: false }); NProgress.done(); }); } render() { const { Component, pageProps } = this.props; return ( <> {this.state.loading && <div className="loader">Loading...</div>} <Component {...pageProps} /> </> ); } } export default MyApp;
在上面的例子中,我们设置了一个 loading
状态,并在路由事件中相应地更新这个状态。然后,我们可以在渲染方法中使用这个状态来决定是否显示加载指示器。此外,我们还引入了 NProgress
来显示一个平滑的进度条。
结论
通过监听 Next.js 的路由事件,我们可以在页面切换时轻松地添加加载指示器。你可以使用简单的状态和条件渲染来实现,也可以使用如 NProgress
这样的库来展示一个更为专业的加载效果。在任何情况下