vue 跳转页面返回时tab状态有误的解决办法
一、前言
最近在做新vue项目的时候遇到了一个问题,就是tab间的切换没有问题,当跳转到其他页面时,且这个页面并非子路由,再用浏览器的返回按钮返回首页时,tab的active始终指向默认的第一个选项。
感觉这还是个比较常见的问题,但是在网上居然没怎么搜索到,自己摸索了一下,搞了一个解决办法出来。由于项目的骨架部分及tab并不是我写的,在此只根据原本的代码给出一个解决方案。
二、代码
1. 监听返回
想要解决这个问题,首先要监听到返回首页的事件,然后把具体的路由值传到Tabbar这个组件里。
// index.vue
<template>
    <div>
        <router-view></router-view>
        <Tabbar :active="tabActive"></Tabbar>
    </div>
</template>
<script>
import Tabbar from './../components/tabbar'
export default {
    data() {
        return {
            tabActive: 'home/home'
        }
    },
    components:{
       Tabbar
    },
    beforeRouteEnter: (to, from, next) => {
        next(vm => {
          vm.tabActive = 'home/' + to.name;
        });
    },
}
</script>
这里用到了beforeRouteEnter这个路由钩子,在vue-router的官网叫做组件内的路由导航守卫。这个钩子可以监听到从其他非子路由的页面通过点击浏览器的返回按钮跳转到首页的事件,然后把这个路由to.name传递到Tabbar组件内。
2. 改变组件内状态
// Tabbar.vue
<template>
    <div class='tabbar'>
        <Item txt='自选' mark='home/home' :sel='selected' @change='getVal'>
            <img src='../assets/images/index1.png' slot='activeImg'/>
            <img src='../assets/images/index0.png' slot='normalImg'/>
        </Item>
        <Item txt='询价' mark='home/inquiry' :sel='selected' @change='getVal'>
            <img src='../assets/images/inquiry1.png' slot='activeImg'/>
            <img src='../assets/images/inquiry0.png' slot='normalImg'/>
        </Item>
        <Item txt='订单' mark='home/hold' :sel='selected' @change='getVal'>
            <img src='../assets/images/hold1.png' slot='activeImg'/>
            <img src='../assets/images/hold0.png' slot='normalImg'/>
        </Item>
        <Item txt='账户' mark='home/mine' :sel='selected' @change='getVal'>
            <img src='../assets/images/mine1.png' slot='activeImg'/>
            <img src='../assets/images/mine0.png' slot='normalImg'/>
        </Item>
    </div>
</template>
<script>
import Item from './item'
export default {
    props: ['active'],
    components: {
        Item
    },
    data: function(){
        return {
            selected: 'home/home'
        }
    },
    watch: {
        'active'(newVal,oldVal) {
            this.selected = newVal;
        }
    },
    methods: {
        getVal: function(val){
            this.selected = val;
        }
    }
}
</script>
<style>
    .tabbar{width: 100%; height: 2.8rem; border-top: 1px solid #ccc; position: fixed; left: 0; bottom: 0;background-color: white;}
</style>
在Tabbar组件内首先通过props接受到外部传进来的active值,再用watch监听器监听active的变化,将新值赋给selected,这样就可以完美解决这个问题了。
最后给出其中Item组件的代码:
<template>
    <div class='itemWrap' @click='fn'>
        <span v-show='bol'><slot name='activeImg'></slot><br/></span>
        <span v-show='!bol'><slot name='normalImg'></slot><br/></span>
        <span :class='{active: bol}'>{{ txt }}</span>
    </div>
</template>
<script>
export default {
    props: ['txt', 'mark', 'sel'],
    computed: {
        bol: function(){
            if (this.mark == this.sel){
                return true;
            }
            return false;
        }
    },
    methods: {
        fn: function(){
            this.$emit('change',this.mark);
            this.$router.push('/' + this.mark);
        }
    }
}
</script>
<style>
.itemWrap{width: 25%; float: left; text-align: center; font-size:0;}
.itemWrap img{width: 1.2rem;height: 1.2rem;margin-top: 0.5rem;}
.itemWrap span{font-size: 0.6rem; color: #666;}
.itemWrap .active{color: #dc4537;}
</style>
三、结语
感觉这个Tabbar写得有些复杂,但是解决此问题的办法应该是比较通用的。希望可以帮到和我遇到一样问题的人。
来源:https://segmentfault.com/a/1190000015944921
vue 跳转页面返回时tab状态有误的解决办法的更多相关文章
- 【ASP.NET 问题】ASP.NET 网站404页面返回200,或者302的解决办法
		
做网站在优化网站时遇到了跳转404页面却返回 200.302状态的问题,这样的话搜索引擎会认为这个页面是一个正常的页面,但是这个页面实际是个错误页面,虽然对访问的用户而言,HTTP状态码是“404”还 ...
 - 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据
		
利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...
 - 返回xml过长时被nginx截断的解决办法
		
返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...
 - JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
		
今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...
 - Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。_StarSasumi_新浪博客
		
Ubuntu"无法解析或打开软件包的列表或是状态文件"的解决办法. (2011-04-30 14:56:14) 转载▼ 标签: ubuntu apt 分类: Ubuntu/Linu ...
 - php history.back返回后表单数据丢失的解决办法
		
js使用history.back返回表单数据丢失的主要原因就是使用了session_start();的原因,该函数会强制当前页面不被缓存.本文章向码农介绍php history.back返回后表单数据 ...
 - 在vue中使用 layui框架中的form.render()无效解决办法
		
下面简单介绍在vue中使用 layui框架中的form.render()无效解决办法. 原文地址:小时刻个人技术博客 > http://small.aiweimeng.top/index.php ...
 - 前台页面long类型数字被四舍五入的解决办法
		
转: 前台页面long类型数字被四舍五入的解决办法 2018-05-28 11:02:38 宣午刚001 阅读数 3566更多 分类专栏: java开发 版权声明:本文为博主原创文章,遵循CC 4 ...
 - 爬虫爬数据时,post数据乱码解决办法
		
最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler. F ...
 
随机推荐
- NOIP2016 D2T1 组合数问题
			
洛谷P2822 数学真重要啊…… 其实解这一题的关键就是组合恒等式:C(n,m)=C(n-1,m)+C(n-1,m-1),然后再知道组合数的矩阵(杨辉三角)和题中n,m的关系就很容易解决了(然而做这题 ...
 - Arduino-数学函数
 - Java——基础简介
			
[历史] 第三代语言: (1)C.Pascal.Fortran面向过程的语言: (2)C++面向过程/面向对象: (3)Java跨平台的纯面向对象的语言: (4).NET跨语言的平台. 第四代语言 ...
 - jq刷新页面
			
//页面加载时绑定按钮点击事件$(function(){ $("#按钮id").click(function(){ refresh(); });});// ...
 - eclipse配置Maven——菜鸟篇
			
首先解释关于webservice: Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序, 可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现 ...
 - Internet History, Technology, and Security(week9)——Web Security
			
Secure Web Connections: Security Public/Private Key - Secure Sockets 凯撒密码容易被破解,后来人们发明了公钥和私钥,由于私钥一定是要 ...
 - Otto
			
导入依赖:implementation 'com.squareup:otto:1.3.8'1定义一个类继承Bus,并且设置单列模式注册和声明订阅者发送事件,最后解除注册与EventBus相同Event ...
 - 北风设计模式课程---单一职责原则(Single Responsibility Principle)
			
北风设计模式课程---单一职责原则(Single Responsibility Principle) 一.总结 一句话总结: 一个类应该有且只有一个变化的原因:单一职责原则(SRP:Single Re ...
 - fedora23禁用不需要的服务?--systemd服务单元?
			
sign up: 签约; 登记, 注册. i'll sign up and go to the front and fight. he persuaded the company to sign up ...
 - python练习题--计算总分平均分操作excel
			
''' 有一个存着学生成绩的文件,里面存的是json串,json串读起来特别不直观,需要你写代码把它都写到excel中,并计算出总分和平均分,json格式如下 { "1":[&qu ...