详解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 相关文章推荐
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
Mar 12 Javascript
window.opener用法和用途实例介绍
Aug 19 Javascript
jQuery新的事件绑定机制on()示例应用
Jul 18 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
分享12个实用的jQuery代码片段
Mar 09 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 Javascript
JavaScript实现星级评价效果
May 17 Javascript
javascript 易错知识点实例小结
Apr 25 Javascript
vue 数据操作相关总结
Dec 17 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编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
Js获取事件对象代码
2010/08/05 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python实现推箱子游戏
2020/03/25 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
Python多线程获取返回值代码实例
2020/02/17 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
电子技术专业中专生的自我评价
2013/12/17 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
投资意向协议书
2015/01/29 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
Python中json.dumps()函数的使用解析
2021/05/17 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers