在项目开发中,我们经常会碰到Tab切换的功能,而在Vue中想实现这样的功能也应该有很多种,常用的三种应该是 Tab路由切换、Tab动态组件切换、通过v-show设置Tab显示隐藏。每种方法实现起来其实都不难,看看官网介绍或看几篇博客应该就能实现。

但这里面其实还有很多细节需要我们去做,如

Tab切换时,切换过的Tab组件状态怎样缓存

在项目中经常会有 页面A -> 页面B -> 页面C 则从 页面C 返回 页面B 时 页面B 使用缓存数据,而页面A 跳到 页面B 时,则页面B每次都请求最新数据。比如我们在某APP内点击 最新新闻(页面A) 选项 跳转到 新闻列表(页面B) 选择某一条新闻 跳转到 新闻详情(页面C) 页面,我们希望,从新闻详情返回到新闻列表时,直接用刚才请求的数据,而不每次都重新发送请求,而从 最新新闻 跳转到 新闻列表时,则都请求最新的数据

父组件如何给子组件传递参数

页面内Tab来回切换后,如何直接返回到上一级页面

页面循环切换时,前进或后退如何保证页面结构正确(具体下面会讲到)

Tab路由切换带缓存

想要通过路由进行切换,就需要使用嵌套路由,即整个大页面是一个路由,点击不同Tab时,再通过嵌套路由来切换不同的路由。

想要Tab切换时保存当前状态可以使用keep-alive包裹,keep-alive具体使用参考这篇文章-vue中动态添加和删除组件缓存 keep-alive

包裹Tab的组件页面我们也要动态的缓存,这里也需要用到keep-alive,只是这个keep-alive需要添加到App.vue内,各个组件的动态缓存我们使用的是keep-alive的include属性。缓存最大数使用max属性

router-link介绍

通过to属性链接目标路由,当被点击时,内部会立刻把 to 的值传到 router.push(),既然是通过router.push()的方式跳转,那么就会往history记录中添加,这样当返回时,可能就会先从Tab3返回到Tab2再返回到Tab1再返回,这种体验很不好,怎样一步返回呢,就是在router-link中添加replace属性,这样当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录,这样就可一步返回了,如:

通过 命名的路由 传递参数,如:User

通过 带查询参数 传递参数,如:Register,结果路由为:/register?plan=private

router-link设置点击事件时需要添加 natvie, 如@click.native="TabClick()"

思路

通过router配置嵌套路由

通过使用keep-alive的include属性有条件的缓存组件

通过store响应式的修改include属性对应的值

通过组件内导航钩子beforeRouteEnter、beforeRouteLeave给store提交mutations修改

实例演示

1:page1->news->page2 然后再依次返回

通过演示我们发现

从page2返回到news时,总是能返回到我们之前保存的状态

从news返回到page1后,再从page1跳转news,不管news之前是什么状态,都会初始化显示购物的页面

2:page1(1)->news(2)->page2(3)->page1(4)->news(5)->page2(6) 然后再依次返回

这个视频里有几个问题需要我们去思考

第四步跳转到第五步,为什么Tab选中为购物、内容选中为鞋包,为什么news组件及内部路由组件都缓存着

第三步返回到第二步,为什么Tab选中为购物、内容选中为母婴,但从右边缓存的组件看,为什么shopping组件也被缓存了

这两个问题我们后边会具体介绍

部分代码示例

1:在router中配置各个路由

这里需要注意,配置children子路由时path不能加 / ,在router-link的to后面写的路由需要以 / 开头,以 / 开头的嵌套路径会被当作根路径

export default new Router({

routes: [

{

path: '/page1',

name: 'page1',

component: () => import(/* webpackChunkName: "test" */ './views/news/page1.vue')

}, {

path: '/page2',

name: 'page2',

component: () => import(/* webpackChunkName: "test" */ './views/news/page2.vue')

}, {

path: '/news',

name: 'newsIndex',

component: () => import(/* webpackChunkName: "test" */ './views/news/news.vue'),

children: [{

path: 'sports',

name: 'sports',

component: () => import(/* webpackChunkName: "test" */ './views/news/sports.vue'),

}, {

path: 'shopping',

name: 'shopping',

component: () => import(/* webpackChunkName: "test" */ './views/news/shopping.vue'),

}, {

path: 'learn',

name: 'learn',

component: () => import(/* webpackChunkName: "test" */ './views/news/learn.vue'),

}]

}

]

})

2:在App.vue组件通过computed计算属性响应式的获取store里的keepAliveArr计算属性,并赋值给keep-alive的include属性,并设置最多可缓存5个组件

page1跳转代码

btnLuYouClick() {

this.$router.push({

path: '/news/shopping',

query: {

content: '购物'

}

});

}

page2跳转代码

btnJumpClick() {

this.$router.push({

path: '/page1'

})

},

sports和learn代码比较简单就不粘贴了

上面的代码应该已经够用,如果需要全部详细代码的就留言吧,我再单独发你。

vue中tab切换前端实现_vue实现Tab切换功能相关推荐

  1. vue中父子组件先后渲染_vue父子组件钩子函数的执行顺序

    加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-& ...

  2. vue中常碰见的坑_Vue 与 Vuex 的第一次接触遇到的坑

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 但是如果是大型项目,很多时候都需要在子组件之间传递数据,使用之前的方式就不太方便 ...

  3. vue中父子组件先后渲染_vue父子组件传值(子传父,非父子组件传值)

    1. 子组件向父组件传值 子组件: <template><div>子组件:<span>{{childValue}}</span><!-- 定义一个 ...

  4. vue中传值和传引用_vue prop属性传值与传引用示例

    vue prop属性传值与传引用示例 vue组件在prop里根据type决定传值还是传引用. 简要如下: 传值:String.Number.Boolean 传引用:Array.Object 若想将数组 ...

  5. vue中父子组件先后渲染_Vue中父子组件执行的先后顺序

    前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看法. 问题如下:请问下图中父子组件执行的先后顺序? 首先, ...

  6. vue中弹窗input框聚焦_Vue 中如何让 input 聚焦?(包含视频讲解)

    作者:Michael Thiessen 译者:前端小智 来源:laracasts.com 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已 ...

  7. vue中局部页面跳转_vue使用感受(二)组件间跳转

    想要看代码高亮的可以去我的微信公众号(pearapple_2015)查看. 昨天我们聊了一下vue的组件间传值,今天来讨论下我遇到的第二个问题组件间跳转.在不使用前端框架的时候,如果我们要点击菜单跳转 ...

  8. vue动态发布到线上_vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件we ...

  9. vue中页面跳转传值_vue 页面跳转传参

    页面之间的跳转传参,正常前端js里写 window.location.href="xxxxx?id=1" 就可以了: 但是vue不一样 需要操作的是路由history,需要用到 V ...

最新文章

  1. JAVA 中 string 和 int 互相转化
  2. C语言之动态内存管理与动态内存函数
  3. 11 张流程图帮你搞定 Spring Bean 生命周期 (核心)
  4. Leetcode400Nth Digit第N个数字
  5. apache OFBiz的安装
  6. 如何在Raspberry Pi上安装Fedora 25
  7. 快来一起玩转LiteOS组件:Curl
  8. Pixazza把每张图片自动变成广告赚钱
  9. 深入解析oracle电子版,深入解析Oracle数据库
  10. python入门必备10个坑_python中的基础坑
  11. 利用python requests库在百度图库上下载图片
  12. cvtColor in Python
  13. Linux 内核通知链(notifier chain)原理和使用方法
  14. 或有事项会计处理研究 ——以广西上市公司为例
  15. Promise 是什么?
  16. “新一代信息技术助力疫情防控”开课:百度集团副总裁吴甜详解AI如何抗疫
  17. 惠普m202dw_HP LaserJet Pro M202dw 激光打印机
  18. 腾讯AI Lab姚建华博士入选2022 AIMBE会士
  19. Python生态工具
  20. CMDB资产管理系统

热门文章

  1. 37-Figma-摹客平台切图标注方案-Mockplus使用
  2. BT 下载软件 uTorrent 被 Chrome 封杀
  3. Universal 2nd Factor (U2F) 概述
  4. SVG—初识3之SVG动画(缓动动画、时间轴线、时间交错)
  5. 机器学习(十二) DeepDearm模型
  6. Docker 安装启动后无法连接服务器
  7. 宜家推出供应链金融方案支持中小企业复工复产;汉高提出全新战略框架 | 美通企业日报...
  8. 论企业如何快速建立SDL流程
  9. 桌面没有计算机的图标,电脑桌面没有图标怎么办
  10. Mathematical biology