微信小程序自定義tabBar在uni-app的適配詳解
引言:此方法可用作大部分微信小程序支持,但uni-app文檔中卻找不到相關(guān)說明的API
需求
需要在微信小程序中,實(shí)現(xiàn)一個(gè)中間圖標(biāo)突出顯示的異形導(dǎo)航欄。
如下圖
實(shí)現(xiàn)方法設(shè)計(jì)
要做這種異形的導(dǎo)航欄,用直接在配置文件里面寫list的方法肯定做不到。那么,就有以下兩種可替代方法。
- 在每一個(gè)頁(yè)面都加載一個(gè)tabBar組件,與頁(yè)面同時(shí)渲染。
- 設(shè)置自定義tabBar,修改tabBar的樣式。
優(yōu)缺點(diǎn)分析:方法1實(shí)現(xiàn)起來略為簡(jiǎn)單,但是會(huì)出現(xiàn)代碼可重用率低,降低性能,已經(jīng)界面跳動(dòng)等問題。方法2則是微信官方提供的,自定義方式,相信在性能方面也會(huì)有很大的優(yōu)勢(shì)。故選擇方法2。
1. 查看文檔及官方Demo
簡(jiǎn)要描述一下就是需要在根目錄中加入一個(gè)custom-tab-bar
目錄,里面的文件結(jié)構(gòu)與自定義組件的結(jié)構(gòu)一致。然后再在小程序配置文件中修改tabbar為custom模式。
主要重點(diǎn)為三個(gè)部分
配置文件
custom-tab-bar目錄
頁(yè)面生命周期中的設(shè)置索引方法
這段代碼其實(shí)很容易理解,pageLifetimes就是監(jiān)聽組件所在頁(yè)面的生命周期。上述代碼就是監(jiān)聽頁(yè)面顯示。當(dāng)頁(yè)面顯示后,獲取到tabBar的對(duì)象,然后再設(shè)置tabBar中的index索引。
2. 遷移到uni-app框架
上面的方法是使用微信小程序的開發(fā)方式,而我使用的是uni-app框架開發(fā)微信小程序的。所以我們需要把它們移植到uni-app框架內(nèi)。
配置文件的修改
uni-app中,page.json被編譯為微信小程序的app.json。所以,我們直接修改page.json
custom-tab-bar目錄的適配
我們知道,uni-app使用的是類Vue開發(fā),將一個(gè)Vue文件編譯為四個(gè)微信頁(yè)面文件(wxml,wxss,json,js)。那么,是否可以直接寫一個(gè)custom-tab-bar.vue
的文件呢?剛開始我也是這么想的,后來發(fā)現(xiàn)uni-app只會(huì)編譯page目錄和component目錄下的vue文件。而微信小程序要求custom-tab-bar
必須在項(xiàng)目的根目錄下。那么就只能在uni-app下創(chuàng)建一個(gè)custom-tab-bar
目錄,并老老實(shí)實(shí)寫微信四件套了。
寫完后,uni-app會(huì)將該目錄完美的復(fù)制至微信小程序項(xiàng)目的根目錄。
tab頁(yè)面內(nèi)的適配方法
這個(gè)在我實(shí)際開發(fā)中,是最令我頭痛的了。因?yàn)槲⑿判〕绦虻?code>this引用與uni-app的this
引用并不相同。所以如果直接復(fù)制代碼是會(huì)編譯出錯(cuò)的。而另一個(gè)問題則是,uni-app并未提供pageLifetimes
的事件監(jiān)聽。
在我經(jīng)過一番摸索之后,發(fā)現(xiàn)將設(shè)置索引方法寫在onShow事件里面,效果是等效的。接下來便只剩下this的問題了。
如果直接復(fù)制的話,會(huì)出現(xiàn)無(wú)任何效果的情況
因?yàn)閡ni-app的this引用不一樣,所以它在判斷getTabBar
的時(shí)候,獲取的是“undefined”所以不會(huì)執(zhí)行下面的操作。如果你將判斷去掉,則會(huì)直接報(bào)“undefined”錯(cuò)誤。
難道實(shí)現(xiàn)不了?其實(shí)不然,萬(wàn)變不離其宗。uni-app也是編譯到小程序的,所以絕對(duì)有跡可循。
我們首先看看uni-app里面this的內(nèi)容。
我們可以很明顯的看到里面有個(gè)$mp
的對(duì)象,說明這應(yīng)該是微信小程序?qū)S玫膶?duì)象。接下來我們繼續(xù)分析$mp
。
這里面有一個(gè)隱藏很深的getTabBar
方法,我們直接調(diào)用它,和在微信小程序里面調(diào)用this.getTabBar
是等效的。
所以我們就可以把onShow
里面的內(nèi)容寫成這樣。
一些優(yōu)雅點(diǎn)的封裝
設(shè)置索引方法獨(dú)立出來
在methods對(duì)象中,添加
setTabBarIndex(index){ if (typeof this.$mp.page.getTabBar === 'function' && this.$mp.page.getTabBar()) { this.$mp.page.getTabBar().setData({ selected:index }) } }
使用mixin避免重復(fù)書寫復(fù)制
在main.js
中,添加
Vue.mixin({ methods:{ setTabBarIndex(index){ if (typeof this.$mp.page.getTabBar === 'function' && this.$mp.page.getTabBar()) { this.$mp.page.getTabBar().setData({ selected:index }) } } } })
混入后的使用
在頁(yè)面文件中
onShow() { this.setTabBarIndex(0) //index為當(dāng)前tab的索引 }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS中ESModule和commonjs介紹及使用區(qū)別
這篇文章主要介紹了JS中ESModule和commonjs介紹及使用區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07JavaScript Sort 的一個(gè)錯(cuò)誤用法示例
這篇文章主要介紹了JavaScript Sort 的一個(gè)錯(cuò)誤用法示例,本文分析了一個(gè)Sort實(shí)例得到了這個(gè)錯(cuò)誤用法并給出了解決方法,需要的朋友可以參考下2015-03-03前臺(tái)js對(duì)象在后臺(tái)轉(zhuǎn)化java對(duì)象的問題探討
在開發(fā)項(xiàng)目中多次遇到前臺(tái)js對(duì)象在后臺(tái)轉(zhuǎn)化java對(duì)象的問題,下面就為大家介紹下前臺(tái)js對(duì)象轉(zhuǎn)后臺(tái)java對(duì)象,感興趣的朋友可以了解下2013-12-12一文詳解JS中的Map、Set、WeakMap和WeakSet
在JavaScript中,Map、Set、WeakMap和WeakSet是四個(gè)不同的數(shù)據(jù)結(jié)構(gòu),它們都有不同的特點(diǎn)和用途,本文詳細(xì)介紹了Map、Set、WeakMap和WeakSet的用法及區(qū)別,需要的朋友可以參考下2023-04-04原生js實(shí)現(xiàn)簡(jiǎn)單的模態(tài)框示例
下面小編就為大家?guī)硪黄鷍s實(shí)現(xiàn)簡(jiǎn)單的模態(tài)框示例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09layer的prompt彈出框,點(diǎn)擊回車,觸發(fā)確定事件的方法
今天小編就為大家分享一篇layer的prompt彈出框,點(diǎn)擊回車,觸發(fā)確定事件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JavaScript必知必會(huì)(十) call apply bind的用法說明
這篇文章主要介紹了JavaScript必知必會(huì)(十) call apply bind的用法說明 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JavaScript中for與forEach分別如何跳出循環(huán)
forEach的優(yōu)勢(shì)一個(gè)是它的回調(diào)函數(shù)形成了一個(gè)作用域,它的curItem和i不會(huì)像for循環(huán)一樣污染全局變量,這篇文章主要給大家介紹了關(guān)于JavaScript中for與forEach分別如何跳出循環(huán)的相關(guān)資料,需要的朋友可以參考下2024-01-01