解決vant中 tab欄遇到的坑 van-tabs
話不多說,先看下問題描述:
我的需求:(和頭條的tab欄類似 ,單擊查看頭條tab欄)
點擊tab欄,下方展示出來當(dāng)前tab欄下的內(nèi)容列表(A頁面),點擊列表進入詳情內(nèi)容(B頁面),但是返回(A頁面)的時候,需要顯示剛才被點擊的tab欄高亮顯示。(如果tab欄橫向有滾動條,那也得讓被選中的高亮顯示)。
所以,大部分人的解決辦法就是將當(dāng)前選中的tab的索引緩存起來,等回到該頁面的時候,讓被緩存的那個高亮顯示出來。
坑的問題在于:van-tabs,里面的v-model默認(rèn)值是0,但是類型卻寫著 number | string 。

但是,在此時用緩存賦值給 v-model = " active " 的時候,active的值需要是number類型,才有效,否則再怎么設(shè)置都是無效的。
【代碼放入項目可直接執(zhí)行】
<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效果

補充知識:vue移動端框架van-sticky粘性布局,實現(xiàn)原理和失效原因及注意點
說到粘性布局,我們最常見的就算在app tab選項卡隨頁面滾動到頂部后懸停在那,看效果

要實現(xiàn)這個效果,最簡單的辦法就是在css樣式里添加position:sticky就可以實現(xiàn),就這么簡單,比用js監(jiān)聽頁面滾動,然后達(dá)到一定高度樣式變?yōu)閒ixed,簡單且性能好。
vue 的van-sticky組件實現(xiàn)粘性的原理就是通過添加position:sticky實現(xiàn)的,但是如果你使用了position:sticky后失效,并沒有效果的原因有:
1.父元素高度沒子元素高,通常為父元素設(shè)置height:100%;
2:父元素設(shè)置了overflow:hidden,overflow-x:hidden,overflow-y:hidden,或者overflow:auto屬性都能影響到
其中父元素是指所有父元素,不單單是上一級父元素,在vue中如果失效了別忘了看app.vue組件里是不是設(shè)置了這些。
解決好失效問題后,我們再看van-sticky的其中一個懸停的時候距離頂部的距離offset-top
offset-top單位為px,在pc端沒問題,但在移動端就有問題了,比如你設(shè)計稿距離頂部的距離為90px,如果你直接offset-top=90,那么在手機上就會距離很遠(yuǎn),
用window.devicePixelRatio獲取設(shè)備的像素,然后再進行換算,說實話不同手機上還是有差別,有的手機達(dá)到效果,有的沒達(dá)到
目前我是用了獲取元素offsetHeight在賦值回去,如this.$refs.getheight.offsetHeight,經(jīng)測試能準(zhǔn)確達(dá)到固定的位置,
如果各位有其他好辦法,請在下面留言,大家一起學(xué)習(xí)。
以上這篇解決vant中 tab欄遇到的坑 van-tabs就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue-cli3.0實現(xiàn)一個多頁面應(yīng)用的歷奇經(jīng)歷記錄總結(jié)
這篇文章主要介紹了vue-cli3.0實現(xiàn)一個多頁面應(yīng)用的歷奇經(jīng)歷,總結(jié)分析了vue-cli3.0實現(xiàn)一個多頁面應(yīng)用遇到的問題與相關(guān)操作注意事項,需要的朋友可以參考下2020-03-03
vue利用vue meta info設(shè)置每個頁面的title與meta信息
這篇文章主要給大家介紹了關(guān)于vue如何利用vue meta info設(shè)置每個頁面的title與meta信息的相關(guān)資料,文中將實現(xiàn)的方法介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-10-10
解決vue的touchStart事件及click事件沖突問題
這篇文章主要介紹了解決vue的touchStart事件及click事件沖突問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue父子組件方法this.$emit()有時候不觸發(fā)問題及解決
這篇文章主要介紹了Vue父子組件方法this.$emit()有時候不觸發(fā)問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
vue+element-ui?校驗開始時間與結(jié)束時間的實現(xiàn)代碼
這篇文章主要介紹了vue+element-ui?校驗開始時間與結(jié)束時間的代碼實現(xiàn),最主要的需求是開始時間不能早于當(dāng)前時間,感興趣的朋友跟隨小編一起看看吧2024-07-07

