详解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 相关文章推荐
js 在定义的时候立即执行的函数表达式(function)写法
Jan 16 Javascript
javascript密码强度校验代码(两种方法)
Aug 10 Javascript
JQuery点击事件回到页面顶部效果的实现代码
May 24 Javascript
AngularJS动态绑定HTML的方法分析
Nov 07 Javascript
老生常谈angularjs中的$state.go
Apr 24 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
Oct 10 Javascript
详谈commonjs模块与es6模块的区别
Oct 18 Javascript
微信小程序图表插件wx-charts用法实例详解
May 20 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 Javascript
Vue-cli项目部署到Nginx服务器的方法
Nov 01 Javascript
js实现div色块拖动录制
Jan 16 Javascript
原生js实现俄罗斯方块
Oct 20 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
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python2随机数列生成器简单实例
2017/09/04 Python
python根据多个文件名批量查找文件
2019/08/13 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
医科学校毕业生自荐信
2013/11/09 职场文书
简历的个人自我评价范文
2014/01/03 职场文书
护理不良事件检讨书
2014/02/06 职场文书
经典演讲稿汇总
2014/05/19 职场文书
研究生求职自荐书
2014/06/23 职场文书
日语专业求职信
2014/07/04 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
MYSQL 运算符总结
2021/11/11 MySQL