详解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 获取字符串字节数的多种方法
Jun 02 Javascript
js+html+css实现鼠标移动div实例
Jan 30 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
小结Node.js中非阻塞IO和事件循环
Sep 18 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
jquery常用的12个小功能
Jul 22 Javascript
vue2组件实现懒加载浅析
Mar 29 Javascript
Bootstrap实现的标签页内容切换显示效果示例
May 25 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
Aug 21 Javascript
JS实现的JSON序列化操作简单示例
Jul 02 Javascript
让JavaScript代码更加精简的方法技巧
Jun 01 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学习笔记之二
2011/01/17 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
img的onload的另类用法
2008/01/10 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python实现根据月份和日期得到星座的方法
2015/03/27 Python
python中的计时器timeit的使用方法
2017/10/20 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
python中 * 的用法详解
2019/07/10 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
Python偏函数实现原理及应用
2020/11/20 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
小学生自我评价范例
2013/09/24 职场文书
企业宣传策划方案
2014/05/29 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
我爱我班主题班会
2015/08/13 职场文书