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判断录入的日期是否合法
Jan 08 Javascript
jQuery select操作控制方法小结
May 26 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
理解javascript中的回调函数(callback)
Sep 02 Javascript
微信小程序开发(一) 微信登录流程详解
Jan 11 Javascript
vue-resource调用promise取数据方式详解
Jul 21 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
vue使用i18n实现国际化的方法详解
Sep 05 Javascript
javascript实现弹幕墙效果
Nov 28 Javascript
Vue双向绑定实现原理与方法详解
May 07 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
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
JSQL  一个 web DB 的封装
2010/05/05 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
python selenium firefox使用详解
2019/02/26 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
J2EE面试题
2016/03/14 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
高中生自我评语大全
2014/01/19 职场文书
中职生自荐信范文
2014/06/15 职场文书
政府班子四风问题整改措施思想汇报
2014/10/08 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
工程移交协议书
2016/03/24 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
图神经网络GNN算法
2022/05/11 Python