详解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 相关文章推荐
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
分页栏的web标准实现
Nov 01 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
jQuery简单实现图片预加载
Apr 20 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
Sep 04 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
Node.js操作Firebird数据库教程
Mar 04 Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 Javascript
React Native时间转换格式工具类分享
Oct 24 Javascript
bootstrap table sum总数量统计实现方法
Oct 29 Javascript
JavaScript实现随机点名程序
Mar 25 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获取mysql数据库中的所有表名的代码
2011/04/23 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
js实现星星打分效果
2020/07/05 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
python版DDOS攻击脚本
2019/06/12 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python装饰器的特性原理详解
2019/12/25 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
营销与策划个人求职信
2013/09/22 职场文书
国际贸易专业推荐信
2013/11/15 职场文书
小学生新学期寄语
2014/01/19 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
优秀部门获奖感言
2014/02/14 职场文书
课外活动实习计划
2015/01/19 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python