导航守卫:beforeRouteUpdate

笔记

1.演示

2.要点

在目的地和当前路由相同,只有参数发生了改变 (例如从/users/1 -> /users/2),就需要使用 beforeRouteUpdate 来响应这个变化 

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)
			})
		},
	},

猜你喜欢

转载自blog.csdn.net/qq_47229902/article/details/128467008