vue3全局路由拦截

2025-03-23 16

Image

vue3全局路由拦截

解决方案

在Vue 3项目中,我们可以通过vue-router提供的钩子函数来实现全局路由拦截。这有助于我们在页面切换时进行权限验证、加载动画展示、页面刷新等操作。

使用 beforeEach 实现基本拦截

最常用的方法是利用router.beforeEach(),它会在每个导航触发时执行:

javascript
import { createRouter, createWebHistory } from 'vue-router'</p>

<p>const router = createRouter({
  history: createWebHistory(),
  routes: [...]
})</p>

<p>// 全局前置守卫
router.beforeEach((to, from, next) => {
  // to:即将进入的目标路由对象
  // from:当前导航正要离开的路由对象
  // next:必须调用该方法来 resolve 这个钩子</p>

<p>console.log('正在导航到:', to.path)</p>

<p>// 检查用户是否登录
  const isLogin = localStorage.getItem('token')</p>

<p>if (to.meta.requiresAuth) { // 如果目标路由需要认证
    if (!isLogin) {
      return next({ name: 'login' }) // 重定向到登录页
    }
  }</p>

<p>next() // 放行
})</p>

<p>export default router

使用 beforeResolve 处理异步数据

如果需要在组件渲染之前获取数据,可以使用beforeResolve:

javascript
router.beforeResolve((to, from, next) => {
  // 获取所有匹配的组件
  const matchedComponents = router.getMatchedComponents(to)</p>

<p>// 如果没有匹配的组件直接放行
  if (!matchedComponents.length) return next()</p>

<p>// 执行异步操作
  Promise.all(matchedComponents.map(Component => {
    if (Component.asyncData) {
      return Component.asyncData()
    }
  })).then(() => {
    next()
  })
})

使用 afterEach 添加全局逻辑

afterEach用于在导航完成后执行一些操作,比如关闭加载动画:

javascript
router.afterEach((to, from) => {
  // 关闭加载动画
  document.body.scrollTop = 0 // 滚动到顶部</p>

<p>// 记录访问日志
  console.log(<code>已导航到 ${to.path})
})

其他思路

  1. 权限控制:可以在beforeEach中加入更复杂的权限判断逻辑,根据用户角色限制访问特定页面。
  2. 标题设置:结合document.title动态设置页面标题。
  3. 缓存处理:为某些页面添加缓存策略,避免重复请求。
  4. 国际化支持:结合i18n插件,在路由变化时切换语言环境。

通过以上几种方式的组合使用,我们可以灵活地实现各种全局路由拦截需求,提升用户体验并确保应用的安全性。

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载