背景
在做快狗打車小程序時(shí),關(guān)于默認(rèn)導(dǎo)航欄,我們遇到了以下的問(wèn)題:
我們希望的是:在各個(gè)機(jī)型頁(yè)面上title一致性 & 個(gè)性化展示、取得左上角點(diǎn)擊事件控制權(quán)及深層級(jí)頁(yè)面的一鍵返回
實(shí)現(xiàn)
step1 自定義
第一步 取得導(dǎo)航欄的控制權(quán)
小程序支持自定義導(dǎo)航欄,只需要在app.json文件中,window項(xiàng)中配置
"navigationStyle": "custom"
這樣微信就放開了導(dǎo)航欄的控制權(quán),只保留右上角的膠囊。
頁(yè)面會(huì)從視窗的頂部開始渲染,如圖

接下來(lái),我們要做的就是實(shí)現(xiàn)一個(gè)導(dǎo)航欄組件,把它放置在頁(yè)面原來(lái)的默認(rèn)導(dǎo)航欄的位置,內(nèi)容什么的完全由開發(fā)者自己定制。
step2 功能點(diǎn)
第二步 梳理導(dǎo)航欄的功能點(diǎn)
導(dǎo)航欄高度 包含兩個(gè)部分:工具欄和title欄, 工具欄的高度一般是固定的20px,title欄的高度需要計(jì)算
導(dǎo)航欄內(nèi)容的定制,需要識(shí)別當(dāng)前頁(yè)面的性質(zhì),根據(jù)不同的頁(yè)面展示不同的內(nèi)容,可以通過(guò)獲取當(dāng)前的頁(yè)面路由棧來(lái)判定當(dāng)前的頁(yè)面性質(zhì)

step3 導(dǎo)航欄組件基本結(jié)構(gòu)
目前快狗打車小程序的基本結(jié)構(gòu)
// navBar.wxml<cover-view class='place-holder'></cover-view><cover-view class='nav-bar'> <cover-view class='tool-bar' style='height: 20px'></cover-view> <cover-view class='title-bar'> <cover-view class='left-cell'> // scene0 常規(guī)首頁(yè) 個(gè)人中心按鈕 // scene1 非常規(guī)首頁(yè) 回首頁(yè)按鈕 // scene2 嵌套頁(yè) 返回上一頁(yè)按鈕 + 回首頁(yè)按鈕 </cover-view> <cover-view class='center-cell'> // scene0 常規(guī)首頁(yè) 個(gè)性化title // scene1 其他頁(yè) 正常title </cover-view> <cover-view class='right-cell'> // 占位用的 </cover-view> </cover-view></cover-view>
Tips:
組件內(nèi)多了一個(gè)占位的place-holder塊,是因?yàn)槟承╉?yè)面有類似滾動(dòng)列表的需求,要保證導(dǎo)航欄始終在視窗的頂部的話,需要使用定位,定位之后脫離文檔流,在最初的時(shí)候需要占位塊保證后續(xù)的頁(yè)面內(nèi)容不會(huì)被導(dǎo)航欄遮擋
使用cover-view布局是因?yàn)榭旃返臉I(yè)務(wù)中有類似map的原生組件,使用view的話有被遮擋的風(fēng)險(xiǎn)
step4 高度計(jì)算
需要計(jì)算title-bar的高度
在 默認(rèn)導(dǎo)航欄 & 無(wú)底部tab欄 的情況下,使用wx.getSystemInfoSync獲取手機(jī)信息,可以看到兩項(xiàng)信息:
這種情況下,二者的差值就是默認(rèn)的導(dǎo)航欄的高度, 但是在設(shè)置了"navigationStyle": "custom"之后,二者的值是一樣的了,因此導(dǎo)航欄的高度我們需要使用統(tǒng)計(jì)的經(jīng)驗(yàn)值。
根據(jù)統(tǒng)計(jì),得到如下的結(jié)果:
{ 'iPhone': 64, 'iPhoneX': 88, 'Android': 68, 'samsung': 72}工具欄的高度可根據(jù)wx.getSystemInfoSync返回值中的statusBarHeight獲取。
至此,我們得到了導(dǎo)航欄的相關(guān)的高度值
// 導(dǎo)航欄總高度 & 占位塊高度placeHoder = totalBar = { 'iPhone': 64, 'iPhoneX': 88, 'Android': 68, 'samsung': 72}// 時(shí)間、信號(hào)等工具欄的高度toolBar = systermInfo.statusBarHeight// 頁(yè)面title欄的高度titleBar = totalBar - toolBarstep5 內(nèi)容定制
在組件的生命周期函數(shù)attached中,我們可以獲取當(dāng)前的頁(yè)面路由棧
let pages = getCurrentPages()let current_page = pages[pages.length - 1].route const NORMAL_ENTRY = '常規(guī)的入口頁(yè)路徑'// scene 0 常規(guī)入口頁(yè) 個(gè)性化title、個(gè)人中心pages.length === 1 && current_page === NORMAL_ENTRY// scene 1 非常規(guī)入口頁(yè) 回首頁(yè)pages.length === 1 && current_page !== NORMAL_ENTRY// scene 2 嵌套頁(yè)面 返回 + 回首頁(yè)pages.length > 1
根據(jù)不同的條件,展示不同的內(nèi)容
最終效果
scene 0 常規(guī)首頁(yè)

scene 1 非常規(guī)首頁(yè)

scene 2 嵌套頁(yè)

目前在生產(chǎn)環(huán)境99%的機(jī)型中,都可以完美的運(yùn)行。
寫在最后
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注