详解vue-router 动态路由下子页面多页共活的解决方案


Posted in Javascript onDecember 22, 2019

我们都知道 vue-router 的动态路由匹配 对组件是原地复用的策略,需要我们在组件中根据不同的 $route 参数展示不同的数据,这在大部分情景下是很高效的做法,但这无疑增加了组件的复杂度,而且不同参数间切换因为是同组件复用,切换效果不加修饰的话会显得很生硬,这里放一张图片感受一下。

详解vue-router 动态路由下子页面多页共活的解决方案

如果我们希望能够每个动态参数都能渲染出一个组件而不是去复用怎么办呢?

我这里提供一个简便的方案

通常动态路由我们都是用来处理详情页

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 }

现在我们完成解耦,同路由组件间参数转变切换的是真实组件了,这里再放一张图片感受一下。

详解vue-router 动态路由下子页面多页共活的解决方案

这个方案说明白了很简单,但还是有一些细节要注意处理,比如记录不同参数页面的滚动条高度,比如怎么处理子页面关闭等等,我的开源项目 e-admin 提供的 ea-view 组件对这个解决方案做了完整的细节处理,有兴趣的话可以参考一下ea-view 。

我正在造一个基于 element-ui 的中后台框架轮子e-admin 欢迎star

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery属性选择器not has怎么写 行悬停高亮显示
Nov 13 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
Nov 23 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
详解jquery easyui之datagrid使用参考
Dec 05 Javascript
javascript实现去除HTML标签的方法
Dec 26 Javascript
详谈AngularJs 控制器、数据绑定、作用域
Jul 09 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
Aug 14 Javascript
Three.js基础学习教程
Nov 16 Javascript
Vue 2.0双向绑定原理的实现方法
Oct 23 Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 #Javascript
javascript中的相等操作符(==与===区别)
Dec 21 #Javascript
JavaScript中的相等操作符使用详解
Dec 21 #Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 #Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 #Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 #Javascript
angularjs模态框的使用代码实例
Dec 20 #Javascript
You might like
十天学会php之第九天
2006/10/09 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python计算N天之后日期的方法
2015/03/31 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
浅谈Python中的私有变量
2018/02/28 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
求职信范文怎么写
2014/01/29 职场文书
优秀团队获奖感言
2014/02/19 职场文书
2015年女生节活动总结
2015/02/27 职场文书
网络舆情信息简报
2015/07/21 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python