官方文档:https://developers.weixin.qq.com/miniprogram/dev/extended/weui/tabbar.html
官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html
以下是处理方式:
/**
* tabbar动态设置功能封装
*
* 需要在所有tabbar页的 onShow 方法里调用一下 updateBarItemAll()方法
*/
/**
* tabbar原始配置
* 和app.json保持一致
* icon图片需使用网络地址
*/
const originData = [
{
"pagePath": "pages/index/index",
"iconPath": "https://static.com/tabbar/home.png",
"selectedIconPath": "https://static.com/tabbar/home_selected.png",
"text": "首页"
},
{
"pagePath": "pages/wo/wo",
"iconPath": "https://static..com/tabbar/wo.png",
"selectedIconPath": "https://static.com/tabbar/wo_selected.png",
"text": "我的"
}
]
export default {
originData,
latestData,
// 单例模式获取数据
getTabbarData () {
if (!this.latestData) {
this.latestData = JSON.parse(JSON.stringify(originData))
}
return this.latestData
},
/**
* 动态设置单项tabbar的图标文案
*/
setBarItem ({ index, text, iconPath, selectedIconPath, }) {
const item = { text, iconPath, selectedIconPath, }
// 更新tabbarData单例
const tabbarData = this.getTabbarData()
tabbarData[index].text = item.text
tabbarData[index].iconPath= item.iconPath
tabbarData[index].selectedIconPath= item.selectedIconPath
// 只在当前为tabbar页时才应用修改
const isTabbar = this.isInTabbarPage()
if (isTabbar) {
this.updateBarItem(index, item)
}
},
/**
* 更新所有tabbar项
*/
updateBarItemAll () {
const tabbarData = this.getTabbarData()
tabbarData.forEach((v, i) => {
this.updateBarItem(i, v)
})
},
/**
* 更新单项tabbar
*/
updateBarItem (index, item) {
wx.setTabBarItem({
index: index,
text: item.text,
iconPath: item.iconPath,
selectedIconPath: item.selectedIconPath,
})
},
/**
* 判断是否是tabbar页面
*/
isInTabbarPage (path) {
const tabbarData = this.getTabbarData()
const tabbarRoutes = tabbarData.map(v => v.pagePath)
if (!path) {
const currentPages = getCurrentPages()
const page = currentPages[currentPages.length - 1]
if (!page) {
return true
} else {
path = page.route
}
}
if (path.match(/^\//)) {
path = path.slice(1)
}
const isIn = tabbarRoutes.indexOf(path) > -1
return isIn
},
}
上述封装的是设置指定某一下标的tabbar项,后续可以考虑对setBarItem做个封装修改,支持通过类型来指定设置某一tabbar,比如指定设置“我的”这一项,这样在tabbar后续调整顺序时就不需要修改index参数。
还可以对wx.setTabBarStyle也做个类似的封装,以支持部分样式的动态修改,这里不再赘述了。