详解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 相关文章推荐
xml 封装与解析(javascript和C#中)
Jul 26 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
Oct 28 Javascript
Knockout visible绑定使用方法
Nov 15 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
JS传值出现中文参数乱码的解决方法
Jun 30 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
js实现五星评价功能
Mar 08 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
Jun 29 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
npm 语义版本控制详解
Sep 10 Javascript
js函数柯里化的方法和作用实例分析
Apr 11 Javascript
小程序开发之模态框组件封装
Apr 23 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
PHP数字格式化
2006/12/06 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
台湾家适得:Homeget
2019/02/11 全球购物
信息专业大学生自我评价分享
2014/01/17 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
母亲节演讲稿
2014/05/27 职场文书
研讨会通知
2015/04/27 职场文书