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获取元素偏移量的方法有哪些
Jun 24 Javascript
Javascript writable特性介绍
Feb 27 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
深入理解JS DOM事件机制
Aug 06 Javascript
JavaScript“尽快失败”的原则实例详解
Oct 08 Javascript
jquery UI Datepicker时间控件冲突问题解决
Dec 16 Javascript
js转换对象为xml
Feb 17 Javascript
Vue2.x中的父子组件相互通信的实现方法
May 02 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
vue2.0移除或更改的一些东西(移除index key)
Aug 28 Javascript
ES6中Array.find()和findIndex()函数的用法详解
Sep 16 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
Feb 27 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
php实现mysql同步的实现方法
2009/10/21 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
PHP类的反射用法实例
2014/11/03 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
javascript引导程序
2008/10/26 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
python获取目录下所有文件的方法
2015/06/01 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
餐饮业会计岗位职责
2013/12/19 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
导游词300字
2015/02/13 职场文书
目标责任书格式范文
2015/05/11 职场文书
个人求职意向书
2015/05/11 职场文书
2016年校长新年寄语
2015/08/17 职场文书
python关于集合的知识案例详解
2021/05/30 Python