详解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中的this实例分析
Apr 28 Javascript
如何用ajax来创建一个XMLHttpRequest对象
Dec 10 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
jQuery动画效果animate和scrollTop结合使用实例
Apr 02 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
Dec 01 Javascript
实现高性能JavaScript之执行与加载
Jan 30 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
Sep 27 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
Dec 25 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
Oct 22 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
PHP4中session登录页面的应用
2008/07/25 PHP
php 设计模式之 单例模式
2008/12/19 PHP
php join函数应用
2011/05/04 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
php 数组元素快速去重
2017/05/05 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
react-router中的属性详解
2017/06/01 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
python enumerate函数的使用方法总结
2017/11/15 Python
手把手教你python实现SVM算法
2017/12/27 Python
python中的随机函数random的用法示例
2018/01/27 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
Python运算符+与+=的方法实例
2021/02/18 Python
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript