解决vant中 tab栏遇到的坑 van-tabs


Posted in Javascript onNovember 04, 2020

话不多说,先看下问题描述:

我的需求:(和头条的tab栏类似 ,单击查看头条tab栏)

点击tab栏,下方展示出来当前tab栏下的内容列表(A页面),点击列表进入详情内容(B页面),但是返回(A页面)的时候,需要显示刚才被点击的tab栏高亮显示。(如果tab栏横向有滚动条,那也得让被选中的高亮显示)。

所以,大部分人的解决办法就是将当前选中的tab的索引缓存起来,等回到该页面的时候,让被缓存的那个高亮显示出来。

坑的问题在于:van-tabs,里面的v-model默认值是0,但是类型却写着 number | string 。

解决vant中 tab栏遇到的坑 van-tabs

但是,在此时用缓存赋值给 v-model = " active " 的时候,active的值需要是number类型,才有效,否则再怎么设置都是无效的。

【代码放入项目可直接执行】

<template>
 <div>
  <van-tabs v-model="active" 
   @click="tabHandler"
   :ellipsis="false"
   :border="false"
   >
   <van-tab v-for="(tabname,idx) in tabList" :key="idx" :title="tabname"></van-tab>
  </van-tabs>
  <van-button @click="toDetailHandler">去详情页</van-button>
 </div>
</template>
<script>
export default{
 data(){
  return{
   active: Number(localStorage.getItem('activeIdx'))?Number(localStorage.getItem('activeIdx')):0,
   tabList:['111111','2222222','3333333','44444444','55555','666666','7777777','88888','999999999'],
  }
 },
 methods:{
  // tab点击事件
  tabHandler(idx){
   this.active = idx;
   localStorage.setItem('activeIdx',idx) // 将选中的tab缓存起来
  },
  // 去详情页
  toDetailHandler(){
   this.$router.push('/tab1')
  }
 }
}
</script>

最终的效果图是这样的,和头条的tab栏的效果是一样的。点击查看 头条tab效果

解决vant中 tab栏遇到的坑 van-tabs

补充知识:vue移动端框架van-sticky粘性布局,实现原理和失效原因及注意点

说到粘性布局,我们最常见的就算在app tab选项卡随页面滚动到顶部后悬停在那,看效果

解决vant中 tab栏遇到的坑 van-tabs

要实现这个效果,最简单的办法就是在css样式里添加position:sticky就可以实现,就这么简单,比用js监听页面滚动,然后达到一定高度样式变为fixed,简单且性能好。

vue 的van-sticky组件实现粘性的原理就是通过添加position:sticky实现的,但是如果你使用了position:sticky后失效,并没有效果的原因有:

1.父元素高度没子元素高,通常为父元素设置height:100%;

2:父元素设置了overflow:hidden,overflow-x:hidden,overflow-y:hidden,或者overflow:auto属性都能影响到

其中父元素是指所有父元素,不单单是上一级父元素,在vue中如果失效了别忘了看app.vue组件里是不是设置了这些。

解决好失效问题后,我们再看van-sticky的其中一个悬停的时候距离顶部的距离offset-top

offset-top单位为px,在pc端没问题,但在移动端就有问题了,比如你设计稿距离顶部的距离为90px,如果你直接offset-top=90,那么在手机上就会距离很远,

用window.devicePixelRatio获取设备的像素,然后再进行换算,说实话不同手机上还是有差别,有的手机达到效果,有的没达到

目前我是用了获取元素offsetHeight在赋值回去,如this.$refs.getheight.offsetHeight,经测试能准确达到固定的位置,

如果各位有其他好办法,请在下面留言,大家一起学习。

以上这篇解决vant中 tab栏遇到的坑 van-tabs就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS target与currentTarget区别说明
Aug 28 Javascript
js获取指定的cookie的具体实现
Feb 20 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
原生javascript实现图片按钮切换
Jan 12 Javascript
js的toLowerCase方法用法实例
Jan 27 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
js中获取jsp表单中radio类型的值简单实例
Aug 15 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 Javascript
JS实现的tab切换选项卡效果示例
Feb 28 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 Javascript
解决select2在bootstrap modal中不能正常使用的问题
Aug 09 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
Nov 04 #Javascript
基于js实现的图片拖拽排序源码实例
Nov 04 #Javascript
在vant中使用时间选择器和popup弹出层的操作
Nov 04 #Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 #Javascript
vant 时间选择器--开始时间和结束时间实例
Nov 04 #Javascript
Vue绑定用户接口实现代码示例
Nov 04 #Javascript
vant picker+popup 自定义三级联动案例
Nov 04 #Javascript
You might like
PHP计数器的实现代码
2013/06/08 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
php封装的page分页类完整实例
2016/10/18 PHP
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
python多线程编程中的join函数使用心得
2014/09/02 Python
Python实现单词翻译功能
2017/06/06 Python
3分钟学会一个Python小技巧
2018/11/23 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
村庄环境整治方案
2014/05/15 职场文书
文明好少年事迹材料
2014/08/19 职场文书
教师反邪教心得体会
2016/01/15 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
golang 如何通过反射创建新对象
2021/04/28 Golang
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
浅谈JS的原型和原型链
2021/06/04 Javascript