vue router动态路由下让每个子路由都是独立组件的解决方案


Posted in Javascript onApril 24, 2018

vue-router 之动态路由

vue-router官网上面是这样说的
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
然后,我就这样写了:
this.$router.push({path:'manage', query: {id: 'tasklist'}})1
结果很明显,失败了。然后我就默默的再次看了一下官网,结果发现了这句话
// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', params: { plan: 'private' }})
注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:
const userId = 123
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user
谨记啊,动态实现二级路由,需要先用变量保存二级路由名称(let router = 'tasklist'),然后调用this.$router.push({path: `/user/${router}`}).

下面看下vue router动态路由下让每个子路由都是独立组件的解决方案

因为 vue-router 对嵌套路由采用的是组件复用策略,这在大部分场景的确是高效的做法,但是如果遇到这种情况:

vue router动态路由下让每个子路由都是独立组件的解决方案

就是要求多个子路由共活,并且有频繁来回切换需求的话,就很希望能让每个子路由都是独立组件了,虽然可以通过监听路由切换

watch: {
   '$route'(to) {
    if (to.meta.path === '/page/buy-details') {
     this.id = to.params.id;
     this.state()
    }
   }
  },

去实时处理更新的数据,我之前一直都是这么做的,包括上面那副动图的页面,但是这真的很麻烦,要让用户切换中准确的回到切换前页面的显示状态,要考虑的东西太多,于是想出了一个解决方案:

子路由组件不涉及实际业务代码,只维护一个打开过的id列表,路由切换到这边时,判断id,没打开过的添加,通过这个列表循环出实际的子路由组件,v-show当前id的,这样就能实现每个实例都是独立的了
我按这个思路写出一个 mixins

details-page.js

export default {
 watch: {
  '$route'(to, from) {
   this.detailsLeave(from);
   this.detailsOpen(to);
  }
 },
 data() {
  return {
   pagePath: '',
   pageId: 0,
   pages: {}
  }
 },
 methods: {
  /**
   * 子页面打开触发
   * @param route
   */
  detailsOpen(route) {
   if (this.detailsPathGet(route.path) === this.pagePath) {
    if (!this.pages[route.params.id]) {
     this.$set(this.pages, route.params.id, {
      id: route.params.id,
      scrollTop: 0
     })
    }
    //路由打开 跳转滚动条
    this.pageId = route.params.id;
    this.$nextTick(()=>{
     this.$parent.$el.firstChild.scrollTop = this.pages[route.params.id].scrollTop;
    });
   }
  },
  /**
   * 路由切换触发
   * 判断离开的路由是否是当前页面,如果是则记录滚动条高度
   * @param route
   */
  detailsLeave(route) {
   if (this.detailsPathGet(route.path) === this.pagePath) {
    if (this.pages[route.params.id]) {
     //记录滚动条高度 此处针对ea-admin后台 不同的框架要记录的滚动条el不同
     this.pages[route.params.id].scrollTop = this.$parent.$el.firstChild.scrollTop ;
    }
   }
  },
  /**
   * 子页面关闭函数
   * @param id
   */
  detailsClose(id) {
   delete this.pages[id]
  },
  /**
   * 取路由不含最后一项参数的地址
   * @param path
   * @returns {string}
   */
  detailsPathGet(path) {
   const i = path.lastIndexOf('/');
   return path.substr(0, i);
  }
 },
 mounted() {
  //通过当前路由地址创建页面识别地址 注:只对path: '/user/:id' 有效 当 path: /user/:id/profile 失效
  this.pagePath = this.detailsPathGet(this.$route.path);
  //执行第一次子页面打开
  this.detailsOpen(this.$route);
  //监听标签关闭消息 此处针对ea-admin后台 不同框架监听关闭方式不同
  this.$tabs.onRemove((page, next) => {
   //收到标签关闭回调,判断关闭的是否是当前页面
   if (page._path === this.pagePath) {
    //触发子页面删除
    this.detailsClose(page.id)
   }
   next()
  })
 }
}

Details.vue

<template>
 <div>
  <your-component
    v-for="item in pages"
    :id="item.id"
    :key="item.id"
    v-show="item.id === pageId">
  </your-component>
 </div>
</template>
<script>
 import YourComponent from '';
 import detailsPage from '../mixins/details-page'
 export default {
  name: 'DetailsPage',
  components: {YourComponent},
  mixins: [detailsPage],
 }
</script>

这样子组件可以只专注处理自己的固定数据,因为组件唯一,不用再去烦恼为每个id存储视图状态了。

总结

以上所述是小编给大家介绍的vue router动态路由下让每个子路由都是独立组件的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 Javascript
JQuery页面的表格数据的增加与分页的实现
Dec 10 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 Javascript
Canvas 绘制粒子动画背景
Feb 15 Javascript
jQuery滑动到底部加载下一页数据的实例代码
May 22 jQuery
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
Apr 03 Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 Javascript
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 jQuery
js实现3D粒子酷炫动态旋转特效
Sep 13 Javascript
详解React路由传参方法汇总记录
Nov 29 Javascript
vue+webpack实现异步加载三种用法示例详解
Apr 24 #Javascript
vue中$refs的用法及作用详解
Apr 24 #Javascript
vue实现选项卡及选项卡切换效果
Apr 24 #Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
Apr 24 #Javascript
js 图片转base64的方式(两种)
Apr 24 #Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 #Javascript
详解开发react应用最好用的脚手架 create-react-app
Apr 24 #Javascript
You might like
一棵php的类树(支持无限分类)
2006/10/09 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
使用tensorflow实现AlexNet
2017/11/20 Python
python配置grpc环境
2019/01/01 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python开启debug模式的方法
2019/06/27 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
降价通知函
2015/04/23 职场文书
奖金申请报告模板
2015/05/15 职场文书
班主任培训研修日志
2015/11/13 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL