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 相关文章推荐
jquery插件开发方法(初学者)
Feb 03 Javascript
js内存泄露的几种情况详细探讨
May 31 Javascript
js 用CreateElement动态创建标签示例
Nov 20 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
JQuery中两个ul标签的li互相移动实现方法
May 18 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
Angular2里获取(input file)上传文件的内容的方法
Sep 05 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
如何获取TypeScript的声明文件.d.ts
May 01 Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 Javascript
基于Node.js的大文件分片上传示例
Jun 19 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 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
Windows下的PHP5.0详解
2006/11/18 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
js Array对象的扩展函数代码
2013/04/24 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
angular.element方法汇总
2015/01/07 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
微信小程序 scroll-view组件实现列表页实例代码
2016/12/14 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Python面向对象封装操作案例详解
2019/12/31 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
中学生爱国演讲稿
2013/12/31 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
升职自荐书
2019/05/09 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle