我项目中有类似这样一段代码
// router.js
const constantRoutes = [{
path: '/a',
component: () => import('@/components/HelloWorld.vue'),
children: [{
path: '1',
name: 'C1',
meta: { instanceName: 'one' },
component: () => import('@/components/C1.vue')
},
{
path: '2',
name: 'C1-2',
meta: { instanceName: 'tow' },
component: () => import('@/components/C1.vue')
}]
}, {
path: '/b',
component: () => import('@/components/HelloWorld.vue'),
children: [{
path: '1',
name: 'C2',
component: () => import('@/components/C2.vue')
}]
}]
// HelloWorld.vue
<template>
<div class="hello">
<h3>container</h3>
<ul>
<keep-alive>
<router-view :key="key" />
</keep-alive>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
},
computed: {
key() {
return this.$route.path
}
},
created () {
console.log('helloWorld', this.$route)
}
}
</script>
当我从a/1这个路径切换到b/1这个路径,他们共同的父组件helloWorld不会重新实例化。vue-router官方的说法也是说,当不同的路由使用同一个组件的时候,为了节省开销不会再实例化。
正常情况:
/a/1 ====> /a/2 helloWorld不会实例化
/a/2 ====> /b/1 helloWorld不会实例化
但是实际的项目中,我遇到的情况恰好相反,父组件因为一级路由的切换会重新实例化,只有切换同级路由下的二级路由才不会实例化。
项目中遇到的情况:
/a/1 ====> /a/2 不会实例化
/a/1 ====> /b/2 /a、/b对应的共同组件会重新实例化。
拥有同一组件的一级路由之间的切换,该共同的组件也会重新实例化,我百思不得其解,也不知道是什么原因,我也并没有在一级路由对应的router-view上设置key属性,希望有大佬指点指点。
大家不要纠结我为什么不把a、b合成一个路由写,因为我的这里每个一级路由都是一个一级菜单。
我的目的就是希望能缓存所有的菜单页面,但是现在这种情况只能让处在同个一级菜单下的二级菜单实现缓存,换个一级菜单就凉了。
因为你a和b是两个不同的路由,只不过是用的同一个组件,你可能需要路由别名