导航守卫:beforeRouteUpdate
笔记
1.演示
2.要点
在目的地和当前路由相同,只有参数发生了改变 (例如从/users/1 -> /users/2),就需要使用 来响应这个变化
beforeRouteUpdate(to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 可以访问组件实例 `this` next() },
3.学习实例
描述:路由相同仅是携带参数不同,对此有两种方式可以处理使用beforeRouteUpdate或者使用watch对路由监测
<template> <div> <ul> <li v-for="item in mes" :key="item.id" @click="toDetail(item.id, item.str)"> { { item.str }} <!-- <router-link :to="`/home/message/detail?id=${item.id}&title=${item.str}`">{ { item.str }}</router-link> --> </li> </ul> <hr /> <router-view></router-view> </div> </template> <script> import router from ../router/router export default { name: Message, data() { return { mes: [ { id: 0, str: 消息001 }, { id: 1, str: 消息002 }, { id: 2, str: 消息003 }, ], } }, //方法一 beforeRouteUpdate(to, from, next) { console.log(到, to, 从, from) // 判断路由是否不相等,不相等时继续执行 if (to.fullPath != from.fullPath) { next() } }, methods: { toDetail(id, str) { // console.log(@@,this.$route) router.push({ name: detail, query: { id, str } }) }, }, //方法二 // watch: { // $route(to, from) { // // console.log(to) // // console.log(from) // console.log(变化) // }, // } } </script>
4.错误:重复路由
此处在测试时出现一个问题,在重复进入同一个路由时会报错
解决方案:在main.js中修改push方法或者在使用push()进行异常捕获
1.main.js
const VueRouterPush = vueRouter.prototype.push vueRouter.prototype.push = function push (to) { return VueRouterPush.call(this, to).catch(err => err) }
2.catch(err=>{})
methods: { toUrl(id, str) { // console.log(@@,this.$route) //使用catch(err=>{}) 捕获异常 router.push({ name: detail, query: { id, str } }).catch(err=>{ console.log(错误,err) }) }, },
上一篇:
通过多线程提高代码的执行效率例子