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 Ext JS 状态默认存储时间
Feb 15 Javascript
JS调用CS里的带参方法实例
Aug 01 Javascript
鼠标滑在标题上显示图片的JS代码
Nov 19 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
jQuery grep()方法详解及实例代码
Oct 30 Javascript
js 原型对象和原型链理解
Feb 09 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
JavaScript 下载svg图片为png格式
Jun 21 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 Javascript
vue搜索和vue模糊搜索代码实例
May 07 Javascript
在Vue环境下利用worker运行interval计时器的步骤
Aug 01 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&amp;&amp;mysql)三
2006/10/09 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
个人能力自我鉴赏
2014/01/25 职场文书
学校消防演习方案
2014/02/19 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
中班教师个人总结
2015/02/05 职场文书
运动员加油词
2015/07/18 职场文书
辞职申请书范本
2019/05/20 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
asyncio异步编程之Task对象详解
2022/03/13 Python