详解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 相关文章推荐
css值转换成数值请抛弃parseInt
Oct 24 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
Jun 19 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
学习JavaScript设计模式之迭代器模式
Jan 19 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
Google 地图事件实例讲解
Aug 06 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
使用localStorage替代cookie做本地存储
Sep 25 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
Oct 24 Javascript
vue实现在v-html的html字符串中绑定事件
Oct 28 Javascript
js实现拖拽元素选择和删除
Aug 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
用缓存实现静态页面的测试
2006/12/06 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python获取地震信息 微信实时推送
2019/06/18 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
往来会计岗位职责
2013/12/19 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
五年级音乐教学反思
2014/02/06 职场文书
投标保密承诺书
2014/05/19 职场文书
大国崛起观后感
2015/06/02 职场文书
上甘岭观后感
2015/06/10 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL