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 ...
随机推荐
- 过滤函数filter
>>> def validate(usernames): if (len(usernames) > 4) and (len(usernames) < 12): retur ...
- Python---协程---重写多进程
一. # 匹配一行文字中所有开头的字母import re s = 'i love you but you don\'t love me' # \b\m findallcontent = re.find ...
- 【NOIP2013模拟】DY引擎
题目 BOSS送给小唐一辆车.小唐开着这辆车从PKU出发去ZJU上课了. 众所周知,天朝公路的收费站超多的.经过观察地图,小唐发现从PKU出发到ZJU的所有路径只会有N(2<=N<=300 ...
- eclipse设置maven web项目打包
如图:eclipse下的maven web项目,打包部署到本地tomcat时,需要关注的2个方面: 1. src/main/webapp目录下的文件,打包到/ 根路径下 2. 添加maven 依赖,打 ...
- HDU-6704 K-th occurrence
Description You are given a string S consisting of only lowercase english letters and some queries. ...
- RabbitMQ 工作图解
(转网上的图) (原文地址 ,http://www.cnblogs.com/knowledgesea/p/5296008.html)
- SpringBoot项目属性配置-第二章
SpringBoot入门 1. 相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了 ...
- 原生js实现简单的放大镜效果
前言:相信很多同学在浏览购物网站的时候都会用到过放大镜的功能,这个功能在日常的网站也会经常用到.接下来我们开始实现一下它吧: (1)首先了解一下放大镜效果的html架构:如下图,它由两部分组成. ht ...
- 安装完Fedora 18后需要做的事情
折腾了好久,在网上查看了好多资料,总算吧安装好的Fedora 18配置得差不多了,现在将过程记录下来,供以后查看用,同时也许还能帮助到和我遇到同一问题的朋友们,以后再有什么再继续添加吧. 一.添加 y ...
- mysql5.7多实例安装
[root@vhost1]# cd /opt/source[root@vhost1]#ls mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz[root@vhost1 ...