导航守卫: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)
			})
		},
	},
经验分享 程序员 微信小程序 职场和发展