我们都知道 vue-router 的动态路由匹配 对组件是原地复用的策略,需要我们在组件中根据不同的 $route 参数展示不同的数据,这在大部分情景下是很高效的做法,但这无疑增加了组件的复杂度,而且不同参数间切换因为是同组件复用,切换效果不加修饰的话会显得很生硬,这里放一张图片感受一下。
如果我们希望能够每个动态参数都能渲染出一个组件而不是去复用怎么办呢?
我这里提供一个简便的方案
通常动态路由我们都是用来处理详情页
const router = new VueRouter({ routes: [ // 动态路径参数 以冒号开头 { path: '/user/:id', component: User, props: true } ] })
User.vue
<template> <div>{{ user.name }}</div> </template> <script> export default { name: 'User', props: ['id'], data() { return {data: {}}; }, watch: { id(id) { this.getUser(id); }, }, computed: { user() { return this.data[this.id] || {name: ''}; }, }, methods: { getUser(id) { setTimeout(() => { // 假装异步 this.data[id] = {id, name: '张' + id}; }, 1000); }, }, mounted() { this.getUser(this.id); }, }; </script>
我们可以发现基本上这样的组件是围绕着 路径参数 即例子中的 id 做处理和渲染,只要我们能提取到这个 路径参数 ,并维护成列表,通过这个列表来渲染实际组件,然后通过 v-show 显示当前 路径参数 下的组件,就可以实现不同参数不同组件的效果了。
简单的来个例子
<template> <div> <user v-for="_id in idList" v-show="_id === id" :id="_id" :key="_id" /> </div> </template> <script> import User from './User.vue'; export default { name: 'UserPage', components: { User, }, props: ['id'], data() { return { idList: [this.id], }; }, watch: { id(id) { if (!this.idList.includes(id)) this.idList.push(id); }, }, }; </script>
然后把这个组件作为 router 组件
{ path: '/user/:id', component: UserPage, props: true }
现在我们完成解耦,同路由组件间参数转变切换的是真实组件了,这里再放一张图片感受一下。
这个方案说明白了很简单,但还是有一些细节要注意处理,比如记录不同参数页面的滚动条高度,比如怎么处理子页面关闭等等,我的开源项目 e-admin 提供的 ea-view 组件对这个解决方案做了完整的细节处理,有兴趣的话可以参考一下ea-view 。
我正在造一个基于 element-ui 的中后台框架轮子e-admin 欢迎star
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍解决vue多个路由共用一个页面的问题,包括了解决vue多个路由共用一个页面的问题的使用技巧和注意事项,需要的朋友参考一下 在日常的vue开发中我们可能会遇见多个路由需要共用一个页面的需求,特别是当路由是通过动态添加的,不同的路由展示的东西只是数据不同其他没有变化。例如: 这种情况的时候,我们发现,其实我们的页面在第一次加载成功后就不会再加载了。所以页面一直显示第一次加载的数据,给人的
本文向大家介绍vue router动态路由下让每个子路由都是独立组件的解决方案,包括了vue router动态路由下让每个子路由都是独立组件的解决方案的使用技巧和注意事项,需要的朋友参考一下 vue-router 之动态路由 下面看下vue router动态路由下让每个子路由都是独立组件的解决方案 因为 vue-router 对嵌套路由采用的是组件复用策略,这在大部分场景的确是高效的做法,但是如果
多页面的配置如下: 在充值中心配置的路由守卫是想在访问 http://localhost:9000/recharge-center/xxx不存在的页面时重定向到充值中心页面,即 http://localhost:9000/recharge-center,但实际上却会重定向到主页,在控制台也可以看到没有进入充值中心的路由守卫钩子函数,而是进入了主页的钩子函数。 主页的路由: 充值中心的路由: 望解答
本文向大家介绍Vue.js路由vue-router使用方法详解,包括了Vue.js路由vue-router使用方法详解的使用技巧和注意事项,需要的朋友参考一下 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的
本文向大家介绍详解vue路由篇(动态路由、路由嵌套),包括了详解vue路由篇(动态路由、路由嵌套)的使用技巧和注意事项,需要的朋友参考一下 什么是路由?网络原理中,路由指的是根据上一接口的数据包中的IP地址,查询路由表转发到另一个接口,它决定的是一个端到端的网络路径。 web中,路由的概念也是类似,根据URL来将请求分配到指定的一个'端'。(即根据网址找到能处理这个URL的程序或模块) 使用vue
本文向大家介绍讲解vue-router之什么是动态路由,包括了讲解vue-router之什么是动态路由的使用技巧和注意事项,需要的朋友参考一下 前言: 今天我来给大家说道说道v-router,这是个什么东西?我们先从动态路由讲起。 GitHub:https://github.com/Ewall1106/mall/tree/master 1、动态路由有一个什么适用场景呢? 比如在写商品详情页面的时候