详解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 图片Silhouette Fadeins渐显效果
Feb 07 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
Jun 01 Javascript
js中自定义方法实现停留几秒sleep
Jul 11 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
vue从使用到源码实现教程详解
Sep 19 Javascript
AngularJS中watch监听用法分析
Nov 04 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
vue.js在标签属性中插入变量参数的方法
Mar 06 Javascript
Angular8路由守卫原理和使用方法
Aug 29 Javascript
利用d3.js实现蜂巢图表带动画效果
Sep 03 Javascript
js 图片懒加载的实现
Oct 21 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中url函数介绍及使用示例
2014/02/13 PHP
php目录操作实例代码
2014/02/21 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
jQuery使用手册之三 CSS操作
2007/03/24 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
2014/09/06 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
Javascript的闭包详解
2014/12/26 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
python和ruby,我选谁?
2017/09/13 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
新闻学专业应届生求职信
2013/11/08 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
同学会邀请函模板
2015/01/30 职场文书
承诺书模板大全
2015/05/04 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书