详解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 最常用的10个自定义函数[推荐]
Dec 26 Javascript
js中settimeout方法加参数的使用实例
Feb 27 Javascript
js数组操作常用方法
May 08 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
Javascript数组Array方法解读
Mar 13 Javascript
JavaScript中的Object对象学习教程
May 20 Javascript
底部悬浮通栏可以关闭广告位的实现方法
Jun 01 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
Apr 18 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
Feb 18 Javascript
详解vue配置后台接口方式
Mar 29 Javascript
jQuery 查找元素操作实例小结
Oct 02 jQuery
判断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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
详解ECMAScript typeof用法
2018/07/25 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
javascript实现计算器功能
2020/03/30 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
工程类专业自荐信范文
2014/03/09 职场文书
汽车促销活动方案
2014/03/31 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
会议新闻稿
2015/07/17 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js