给tabBar设置"selectedColor": "#2dc777",运行到手机APP端和小程序端都是不生效,先闪过这个颜色#2dc777,最终还是变成黑色。在代码里也没有另外动态设置这个属性。项目用到了uview-plus框架。
- 发布:2026-06-09 11:00
- 更新:55 分钟前
- 阅读:86
7***@qq.com (作者)
找到问题了,是我在项目里用到了uview-plus框架,uview-plus 的全局 mixin 在 mixin.js 中,会在 每个页面的 onLoad 和 onShow 中调用 upApplyNativeThemeUI() ,最终执行 uni.setTabBarStyle() 把 tabBar 颜色硬编码为:
- selectedColor: '#303133' (接近黑色)
- color: '#909399' (灰色)
所以切换 tab 后颜色就被覆盖了。
解决方案如下:
在 App.vue 的 onLaunch 中 拦截 uni.setTabBarStyle ,让它始终使用 pages.json 中配置的颜色
在APP.vue的onLaunch勾子里加入以下代码:
// 拦截 uni.setTabBarStyle,防止 uview-plus 主题系统覆盖 tabBar 颜色
const originalSetTabBarStyle = uni.setTabBarStyle.bind(uni)
const customTabBarStyle = {
color: '#666',
selectedColor: '#2dc777',
backgroundColor: '#fff',
borderStyle: 'black'
}
uni.setTabBarStyle = function(options = {}) {
// 合并传入的配置,但以自定义颜色为准
const merged = { ...options, ...customTabBarStyle }
return originalSetTabBarStyle(merged)
} 7***@qq.com (作者)
上面那个方案不适用于小程序,所以另外再加了一些处理:
1、在main.js里加入了以下代码:main.js 中覆盖 upApplyNativeThemeUI 阻止自动触发,放在app.use(uviewPlus)之后
// 覆盖 uview-plus 全局 mixin 中的 upApplyNativeThemeUI,防止它覆盖 tabBar 颜色
app.mixin({
methods: {
upApplyNativeThemeUI() {
// 空实现:阻止 uview-plus 调用 applyNativeThemeUIDeferred 覆盖 tabBar 颜色
}
}
})
2、兜底 : App.vue 的 onShow 中恢复 selectedColor (应用从后台返回时)
// 恢复 tabBar 选中色(小程序端 uview-plus 会覆盖,需要在这里恢复)
uni.setTabBarStyle({
selectedColor: '#2dc777'
});
7***@qq.com (作者)
新建空白的没问题,现在没找到问题出在哪里了
2026-06-09 14:12