详解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中html、val与text三者属性取值的联系与区别介绍
Dec 29 Javascript
js关于字符长度限制的问题示例探讨
Jan 24 Javascript
JS判断两个时间大小的示例代码
Jan 28 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
May 06 Javascript
纯js代码实现简单计算器
Dec 02 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
React中使用async validator进行表单验证的实例代码
Aug 17 Javascript
vue使用rem实现 移动端屏幕适配
Sep 26 Javascript
了解前端理论:rscss和rsjs
May 23 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 Javascript
JavaScript setInterval()与setTimeout()计时器
Dec 27 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
python reverse反转部分数组的实例
2018/12/13 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
Python time库基本使用方法分析
2019/12/13 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
python 字符串格式化的示例
2020/09/21 Python
Django中template for如何使用方法
2021/01/31 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
秋季运动会稿件
2014/01/30 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
匿名检举信范文
2015/03/02 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
团结主题班会
2015/08/13 职场文书