我们都知道vue-router的动态路由匹配是对组件的就地复用策略,需要我们根据不同的$route显示不同的组件parameters数据,这在大多数场景下是非常高效的,但无疑增加了组件的复杂度,而且由于不同参数之间的切换被同一个组件复用,如果不做修改,切换效果会显得生硬。在这里用一张图感受一下。如果我们希望能够为每个动态参数渲染一个组件而不是重用它怎么办?这里我提供一个简单的解决方案。通常,动态路由用于处理详情页。constrouter=newVueRouter({routes:[//动态路径参数以冒号开头{path:'/user/:id',component:User,props:true}]})User.vue{{user.name}}
我们可以发现,基本上这样的组件都是围绕路径参数,也就是例子中的id进行处理和渲染的,只要我们能够把这个路径参数提取出来,维护成一个列表,渲染通过这个列表显示实际的组件,然后通过v-show显示当前路径参数下的组件,可以达到不同参数不同组件的效果。简单示例
模板><脚本>从'./User.vue'导入用户;exportdefault{name:'UserPage',components:{User,},props:['id'],data(){return{idList:[this.id],};},watch:{id(id){if(!this.idList.includes(id))this.idList.push(id);},},};然后将这个组件作为路由组件使用{path:'/user/:id',component:UserPage,props:true}现在我们已经完成了解耦,才是真正的组件在路由组件之间切换参数,这里又是一张图片感觉。这个方案解释起来很简单,但是还是有一些细节需要注意,比如记录不同参数页面的滚动条高度,比如子页面的关闭如何处理等等.我的开源项目e-admin提供的ea-view组件对这个解决方案进行了完整的详细处理。有兴趣的可以参考ea-view。我正在搭建一个基于element-ui的中后台框架wheele-admin欢迎star