详解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 相关文章推荐
javascript之解决IE下不渲染的bug
Jun 29 Javascript
学习ExtJS border布局
Oct 08 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
Sep 06 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
js eval函数使用,js对象和字符串互转实例
Mar 06 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
Mar 30 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
jQuery实现轮播图源码
Oct 23 jQuery
JS实现网站楼层导航效果代码实例
Jun 16 Javascript
Vue实现随机验证码功能
Dec 29 Vue.js
判断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 彩色文字实现代码
2009/06/29 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
C语言编程练习
2012/04/02 面试题
联想C++笔试题
2012/06/13 面试题
计算机毕业大学生推荐信
2013/12/01 职场文书
施工资料员的岗位职责
2013/12/22 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
护士节策划方案
2014/05/19 职场文书
大学新闻系求职信
2014/06/03 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
2015双创工作总结
2015/07/24 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python