解决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 相关文章推荐
javascript 页面只自动刷新一次
Jul 10 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
jQuery点击弹出下拉菜单的小例子
Aug 01 Javascript
javascript批量修改文件编码格式的方法
Jan 27 Javascript
jQuery插件zepto.js简单实现tab切换
Jun 16 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
将angular-ui的分页组件封装成指令的方法详解
May 10 Javascript
angular4自定义组件详解
Sep 28 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 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 变量定义和变量替换的方法
2009/07/30 PHP
php getsiteurl()函数
2009/09/05 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
js不是基础的基础
2006/12/24 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
浅谈sass在vue注意的地方
2017/08/10 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
行政经理的岗位职责
2013/11/23 职场文书
施工班组长岗位职责
2014/01/05 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL