最近在看教程做一个树洞类小程序,教程中是采用将底部tabbar写成一个组件然后每个页面引用的方法,这在小程序上无法消除翻页效果,用户体验极度不友好。目前解决方案有两种:
由于项目重写较为繁琐,本文采用第二种解决方案。
配置tabBar属性,并开启“usingComponents ”项,也可在每个tab页面中全部开启“usingComponents ”项
"tabBar": {
"custom": true, //表示自定义Tabbar
"color": "#707070",//未选中颜色
"selectedColor": "#00c4cc",//选中后颜色
"list": [//栏目,一般为2-5个
{
"pagePath": "pages/home/index",
"iconPath": "/static/img/home_def.png",
"selectedIconPath": "/static/img/home_sel.png",
"text": "首页"
},
{
"pagePath": "pages/catetory/index",
"iconPath": "/static/img/type_def.png",
"selectedIconPath": "/static/img/type_sel.png",
"text": "分类"
},
{
"pagePath": "pages/home/index",
"iconPath": "/static/img/my_def.png",
"selectedIconPath": "/static/img/my_sel.png",
"text": "我的"
}
]
},
"sitemapLocation": "sitemap.json",
"usingComponents":{}
在pages文件夹同级目录下,新建一个文件夹,文件夹名称为 “custom-tab-bar” ,内含4个文件(json,xwml,js,wxss),这里特别注意,命名必须完全相同,4个文件的名称部分均为index。
wxml: 列表渲染各tab
<cover-view class="tab-bar">
<cover-view class="tab-bar-border">cover-view>
<cover-view wx:for="{{list}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab">
<cover-image src="{{selected === index ? item.selectedIconPath : item.iconPath}}">cover-image>
<cover-view style="color: {{selected === index ? selectedColor : color}}">{{item.text}}cover-view>
cover-view>
cover-view>
js: 先配置一遍json中的配置,然后定义跳转方法,如果希望自己定义navigateTo等跳转方式,直接在method里面添加对应函数,并在wxml中绑定即可。
Component({
data: {
selected: 0,
color: "#707070",
selectedColor: "#00c4cc",
list: [{
pagePath: "/pages/home/index",
iconPath: "/static/img/home_def.png",
selectedIconPath: "/static/img/home_sel.png",
text: "首页"
}, {
pagePath: "/pages/catetory/index",
iconPath: "/static/img/type_def.png",
selectedIconPath: "/static/img/type_sel.png",
text: "分类"
}
,{
pagePath: "/pages/home/index",
iconPath: "/static/img/my_def.png",
selectedIconPath: "/static/img/my_sel.png",
text: "我的"
}
]
},
attached() {
},
methods: {
switchTab(e) {
const data = e.currentTarget.dataset
const url = data.path
wx.switchTab({url})
this.setData({
selected: data.index
})
}
}
})
关于wxss大家自己写,将其固定在底部即可
主要是由于官方例子中绑定的switchTab造成的,在这里他进行了第二次setData,因此页面刷新一次,只需要把相应的代码注释即可:
switchTab(e) {
const data = e.currentTarget.dataset
const url = data.path
wx.switchTab({url})
//this.setData({
// selected: data.index
//})
}
开始百思不得其解,选中之后不切换页面,将selected变量输出,压根就没变化,这里有可能是内部的异步函数有点问题,可以通过在各页面的onshow函数加入检查函数来保证一致性:
if (typeof this.getTabBar === 'function' &&
this.getTabBar()) {
this.getTabBar().setData({
selected: 0 //这里写相应页面的序号
})
}
最后大功告成啦!
参考:
微信小程序tabBar自定义详细教程代码片段
微信小程序自定义tabBar和遇到的一些问题