一、前言

最近在做新vue项目的时候遇到了一个问题,就是tab间的切换没有问题,当跳转到其他页面时,且这个页面并非子路由,再用浏览器的返回按钮返回首页时,tab的active始终指向默认的第一个选项。

感觉这还是个比较常见的问题,但是在网上居然没怎么搜索到,自己摸索了一下,搞了一个解决办法出来。由于项目的骨架部分及tab并不是我写的,在此只根据原本的代码给出一个解决方案。

二、代码

1. 监听返回

想要解决这个问题,首先要监听到返回首页的事件,然后把具体的路由值传到Tabbar这个组件里。


  1. // index.vue
  2. <template>
  3. <div>
  4. <router-view></router-view>
  5. <Tabbar :active="tabActive"></Tabbar>
  6. </div>
  7. </template>
  8. <script>
  9. import Tabbar from './../components/tabbar'
  10. export default {
  11. data() {
  12. return {
  13. tabActive: 'home/home'
  14. }
  15. },
  16. components:{
  17. Tabbar
  18. },
  19. beforeRouteEnter: (to, from, next) => {
  20. next(vm => {
  21. vm.tabActive = 'home/' + to.name;
  22. });
  23. },
  24. }
  25. </script>

这里用到了beforeRouteEnter这个路由钩子,在vue-router的官网叫做组件内的路由导航守卫。这个钩子可以监听到从其他非子路由的页面通过点击浏览器的返回按钮跳转到首页的事件,然后把这个路由to.name传递到Tabbar组件内。

2. 改变组件内状态


  1. // Tabbar.vue
  2. <template>
  3. <div class='tabbar'>
  4. <Item txt='自选' mark='home/home' :sel='selected' @change='getVal'>
  5. <img src='../assets/images/index1.png' slot='activeImg'/>
  6. <img src='../assets/images/index0.png' slot='normalImg'/>
  7. </Item>
  8. <Item txt='询价' mark='home/inquiry' :sel='selected' @change='getVal'>
  9. <img src='../assets/images/inquiry1.png' slot='activeImg'/>
  10. <img src='../assets/images/inquiry0.png' slot='normalImg'/>
  11. </Item>
  12. <Item txt='订单' mark='home/hold' :sel='selected' @change='getVal'>
  13. <img src='../assets/images/hold1.png' slot='activeImg'/>
  14. <img src='../assets/images/hold0.png' slot='normalImg'/>
  15. </Item>
  16. <Item txt='账户' mark='home/mine' :sel='selected' @change='getVal'>
  17. <img src='../assets/images/mine1.png' slot='activeImg'/>
  18. <img src='../assets/images/mine0.png' slot='normalImg'/>
  19. </Item>
  20. </div>
  21. </template>
  22. <script>
  23. import Item from './item'
  24. export default {
  25. props: ['active'],
  26. components: {
  27. Item
  28. },
  29. data: function(){
  30. return {
  31. selected: 'home/home'
  32. }
  33. },
  34. watch: {
  35. 'active'(newVal,oldVal) {
  36. this.selected = newVal;
  37. }
  38. },
  39. methods: {
  40. getVal: function(val){
  41. this.selected = val;
  42. }
  43. }
  44. }
  45. </script>
  46. <style>
  47. .tabbar{width: 100%; height: 2.8rem; border-top: 1px solid #ccc; position: fixed; left: 0; bottom: 0;background-color: white;}
  48. </style>

在Tabbar组件内首先通过props接受到外部传进来的active值,再用watch监听器监听active的变化,将新值赋给selected,这样就可以完美解决这个问题了。

最后给出其中Item组件的代码:


  1. <template>
  2. <div class='itemWrap' @click='fn'>
  3. <span v-show='bol'><slot name='activeImg'></slot><br/></span>
  4. <span v-show='!bol'><slot name='normalImg'></slot><br/></span>
  5. <span :class='{active: bol}'>{{ txt }}</span>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. props: ['txt', 'mark', 'sel'],
  11. computed: {
  12. bol: function(){
  13. if (this.mark == this.sel){
  14. return true;
  15. }
  16. return false;
  17. }
  18. },
  19. methods: {
  20. fn: function(){
  21. this.$emit('change',this.mark);
  22. this.$router.push('/' + this.mark);
  23. }
  24. }
  25. }
  26. </script>
  27. <style>
  28. .itemWrap{width: 25%; float: left; text-align: center; font-size:0;}
  29. .itemWrap img{width: 1.2rem;height: 1.2rem;margin-top: 0.5rem;}
  30. .itemWrap span{font-size: 0.6rem; color: #666;}
  31. .itemWrap .active{color: #dc4537;}
  32. </style>

三、结语

感觉这个Tabbar写得有些复杂,但是解决此问题的办法应该是比较通用的。希望可以帮到和我遇到一样问题的人。

来源:https://segmentfault.com/a/1190000015944921

vue 跳转页面返回时tab状态有误的解决办法的更多相关文章

  1. 【ASP.NET 问题】ASP.NET 网站404页面返回200,或者302的解决办法

    做网站在优化网站时遇到了跳转404页面却返回 200.302状态的问题,这样的话搜索引擎会认为这个页面是一个正常的页面,但是这个页面实际是个错误页面,虽然对访问的用户而言,HTTP状态码是“404”还 ...

  2. 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据

    利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...

  3. 返回xml过长时被nginx截断的解决办法

    返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...

  4. JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  5. Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。_StarSasumi_新浪博客

    Ubuntu"无法解析或打开软件包的列表或是状态文件"的解决办法. (2011-04-30 14:56:14) 转载▼ 标签: ubuntu apt 分类: Ubuntu/Linu ...

  6. php history.back返回后表单数据丢失的解决办法

    js使用history.back返回表单数据丢失的主要原因就是使用了session_start();的原因,该函数会强制当前页面不被缓存.本文章向码农介绍php history.back返回后表单数据 ...

  7. 在vue中使用 layui框架中的form.render()无效解决办法

    下面简单介绍在vue中使用 layui框架中的form.render()无效解决办法. 原文地址:小时刻个人技术博客 > http://small.aiweimeng.top/index.php ...

  8. 前台页面long类型数字被四舍五入的解决办法

    转: 前台页面long类型数字被四舍五入的解决办法 2018-05-28 11:02:38 宣午刚001 阅读数 3566更多 分类专栏: java开发   版权声明:本文为博主原创文章,遵循CC 4 ...

  9. 爬虫爬数据时,post数据乱码解决办法

    最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler.     F ...

随机推荐

  1. Django【第6篇】:Django之ORM单表操作(增删改查)

    django之数据库表的单表查询 一.添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name =& ...

  2. AGC009题解

    为了1天4题的flag不倒所以开新坑... B. 考虑把这棵树直接建出来,f[i]表示i最少的比赛次数,然后按照定义转移就行了. //Love and Freedom. #include<cst ...

  3. angularJS拖动marker时popup一直显示

    $scope.$on('leafletDirectiveMarker.drag', function(event, arg) { arg.leafletObject.openPopup(); });

  4. SonarQube规则之漏洞类型

    漏洞类型: 1."@RequestMapping" methods should be "public"漏洞 阻断标注了RequestMapping是contr ...

  5. zrender笔记----(数字Number组件)出现的问题和解决办法

    1.期望的效果是这样子的(这也是最终结果): 2.开始是用json假数据,开始没考虑null的问题,导致在判断传值处,判断有误. 导致在对接接口时,凌乱了,后来修改了下变成后面图C的逻辑,json数据 ...

  6. STM32开发板的TIM3开启和关闭

    关闭定时器中断要考虑好多情况 1)关闭定时器时,定时器是否在处在工作状态 2)关闭定时器时,定时器是否正好进入中断,造成关闭程序出现断层,进而无法实现完整关闭程序,此时可以使用高一级别的外部中断强制进 ...

  7. BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  8. POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )

    题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...

  9. Java——容器(Set)

    [Set接口] <1>Set接口是Collection的子接口,Set接口没有提供额外的方法. <2>实现Set接口的容器类中的元素是没有顺序的,而且不可以重复. <3& ...

  10. 前端String类型转JSON类型

    在js中通过ajax获取数据后,赋值给前端树形插件zTree中的zNodes,但一直失败如图: 浏览器端报错: 于是我将zNodes变量的值直接写死,并打印这两个的值,如图 再次运行成功.浏览器控制台 ...