vue路由添加时间戳

问题处理一——在应用实例创建时加入路由监听

问题描述:不关闭浏览器和在不结束当前VUE应用实例之前,再次重新进入页面时,发现页面没有重新请求接口,即,不刷新页面不重新请求接口(接口本身会在mounted中进行调用)。而实际应用中请求头中的部分参数已经发生改变,需要重新请求来刷新页面数据。
原因分析App.vue中引入了<keep-alive>组件,由于不携带参数的情况下,本质上是对当前组件实例的重用,也就是路由未发生变化。因此不会刷新当前组件,不会调用created()mounted()等生命周期中的函数。

<keep-alive>
  <router-view :key="$route.fullPath"></router-view>
</keep-alive>

解决方案:在跳转页面时加上时间戳,选择在全局路由前置守卫处加入时间戳,后续如有需要缓存的页面,可在路由配置处添加参数控制<keep-alive>组件,是否进行缓存。

router.beforeEach((to, from, next) => {
	let timestamp = Date.now()
	if (!to.query.t){
	  next({...to, query: {...to.query, t: timestamp}})
	} else {
      next()
  }
})

问题处理二——全局路由添加时间戳

问题描述:一开始想在全局前置路由中添加时间戳,因此写了以下代码,报错:Maximum call stack size exceeded

router.beforeEach((to, from, next) => {
	let timestamp = Date.now()
	next({...to, query: {...to.query, t: timestamp}})
})

原因分析
1.在 router.beforeEach 钩子函数中,对 to 对象进行了过度修改,导致钩子函数不断被触发,从而导致调用栈溢出。
2.在 next 函数中,重复调用了 next({…to, query:{t: Date.now()}})。这会导致路由重复触发 beforeEach 钩子函数,从而陷入无限循环。
解决方法
1.使用一个标志位来跟踪是否已经添加了时间戳,从而避免重复添加

router.beforeEach((to, from, next) => {
  if (!to.query.t) {
    next({ ...to, query: { ...to.query, t: Date.now() }})
  } else {
    next()
  }
})

2.将时间戳的添加逻辑放在 router.afterEach 钩子函数中,而不是 beforeEach。这样可以确保只在导航完成后添加时间戳,避免无限循环。

router.afterEach((to, from) => {
  to.query.t = Date.now()
})

3.除此之外还需要注意,在修改 to 对象时,只修改必要的部分,而不是完全覆盖整个对象。

router.beforeEach((to, from, next) => {
  next({ ...to, query: { ...to.query, t: Date.now() }})
})
### Vue 路由守卫实现方法 Vue 路由守卫是一种非常强大的功能,可以用来控制用户的访问权限以及在路由切换时执行特定的操作。以下是几种常见的路由守卫实现方式: #### 1. 全局前置守卫 全局前置守卫会在每个路由跳转之前触发,适用于需要在整个应用范围内统一处理的场景。 ```javascript import Vue from 'vue'; import Router from 'vue-router'; Vue.use(Router); const router = new Router({ routes: [ // 定义你的路由 ] }); router.beforeEach((to, from, next) => { console.log(`Navigating to ${to.name} at ${new Date().toLocaleTimeString()}`); next(); // 必须调用 next() 才能继续导航 }); export default router; ``` 上述代码展示了一个简单的全局前置守卫示例[^1]。它会记录每次导航的时间戳并打印到控制台。 --- #### 2. 路由独享守卫 路由独享守卫仅作用于某一条具体的路由上,在进入或离开这条路由时会被触发。 ```javascript const router = new VueRouter({ routes: [ { path: '/admin', component: Admin, beforeEnter: (to, from, next) => { if (localStorage.getItem('admin')) { next(); } else { next({ path: '/login', query: { redirect: to.fullPath } }); } } } ] }); ``` 此示例展示了如何为 `/admin` 路径设置一个独享守卫[^2]。如果用户没有管理员权限,则会被重定向至登录页。 --- #### 3. 组件内守卫 组件内守卫可以直接写入目标组件内部,通常用于更细粒度的控制逻辑。 ```javascript // 假设这是 Admin.vue 文件中的部分代码 export default { beforeRouteEnter(to, from, next) { // 此处无法获取 this 的上下文 next(vm => { vm.$emit('event-name'); }); }, beforeRouteLeave(to, from, next) { if (!this.confirmNavigation()) { next(false); } else { next(); } } }; ``` 在这个例子中,`beforeRouteEnter` 和 `beforeRouteLeave` 是两个常用的组件内守卫[^4]。前者可以在进入组件前做一些初始化工作;后者则可用于确认用户是否真的希望离开当前页面。 --- #### 4. 权限控制的实际案例 为了更好地管理复杂的权限体系,可以通过 JWT 验证等方式进一步扩展路由守卫的功能。 ```javascript router.beforeEach(async (to, from, next) => { const isAuthenticated = await checkAuthenticationStatus(); // 自定义身份验证函数 if (to.matched.some(record => record.meta.requiresAuth)) { if (isAuthenticated) { next(); } else { next('/login?redirect=' + encodeURIComponent(to.fullPath)); } } else { next(); } }); ``` 这段代码实现了基于元信息 (`meta`) 的权限校验机制[^3]。通过给某些路由添加自定义属性(如 `requiresAuth`),可以让这些路由具备额外的安全保障。 --- ### 总结 以上介绍了四种主要类型的 Vue 路由守卫及其具体实现方法。每种类型都有其适用范围和特点,开发者可以根据实际需求灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ansheng1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值