场景:
vue实现导航栏,二级导航栏跳转到相同页面,通过参数来实现到该页面后,根据参数来滚动到对应到位置
网上的解决方法:
通常情况下我们喜欢设置keepAlive 包裹 router-view
<div id="app"> <keep-alive> <router-view></router-view> </keep-alive> </div>
同时在created 中触发请求,在路由参数不同的情况下并不会执行对应的操作。
解决方法:
1、给 router-view 设置 key 属性为路由的完整路径
<keep-alive> <router-view :key="$route.fullPath"></router-view> </keep-alive>
这种方法我觉得应该是一劳永逸的方法,可能对性能造成一定损耗。不适用于一个tab切换路由并加载列表的组件,会造成页面白屏,dev模式不会自动刷新,是个坑
2、官方给出的方法是通过 watch 监听路由变化,做判断路由路径然后调用响应的方法
watch: { '$route'() { if (this.$route.path === 'test') { this.test(); } } } watch: { 'id': { handler: 'test', //调用方法 immediate: true, //进入立即执行一次 } },
这两种方法推荐第一种,第二种需要先对参数id进行赋值
3、通过组件导航守卫来设置对应的meta 属性
beforeRouteEnter: (to, from, next) = > { // 写在当前组件 to.meta.keepAlive = false next() }, beforeRouteLeave: (to, from, next) = > { //写在前一个组件 to.meta.keepAlive = false next() },
我的解决方法
网上的方法都是试了下,还是没有效果,于是开始自己瞎鼓捣,还真的解决了,所以来记录一下,这个方法还是比较笨拙的,如果有更好的解决方法,希望告知,??
1.首先在路由添加参数
// 关于我们 { path: '/aboutusBase', component: AboutUs, redirect: '/aboutus', children: [ { path: '/aboutus/:index', components: { default: Banner, founder: Founder, hall_of_fame: HallOfFame, team: Team, }, name: 'AboutUsLink' } ] },
2.跳转路由
this.$router.push({ name: "AboutUsLink", params: { index: list_index } //list_index为可变参数 });
3.在你需要跳转的页面设置路由监听
watch: { // 利用watch方法检测路由变化: $route: function(to, from) { if (to.path !== from.path) { this.selected_index = to.params.index; // 获取参数 this.getAnimateScroll(); // 滚动方法 } } },
⚠️在接收参数的时候,一定要对参数进行过滤判断