详解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 相关文章推荐
PJBlog插件 防刷新的在线播放器
Oct 25 Javascript
Javascript 圆角div的实现代码
Oct 15 Javascript
jQuery之自动完成组件的深入解析
Jun 19 Javascript
jQuery选择器全面总结
Jan 06 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
javascript获取重复次数最多的字符
Jul 08 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
Oct 23 Javascript
JS如何判断json是否为空
Jul 06 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
Mar 15 Javascript
js校验开始时间和结束时间
May 26 Javascript
vue过滤器实现日期格式化的案例分析
Jul 02 Javascript
详解Java中String JSONObject JSONArray List转换
Nov 13 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二分查找二种实现示例
2014/03/12 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
Python 里最强的地图绘制神器
2021/03/01 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
党员创先争优承诺书
2014/03/26 职场文书
化学专业自荐信
2014/05/28 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫