7***@qq.com
7***@qq.com
  • 发布:2026-06-09 11:00
  • 更新:55 分钟前
  • 阅读:86

uniapp开发项目,在page.json设置tabBar的"selectedColor": "#2dc777"不生效

分类:uni-app

给tabBar设置"selectedColor": "#2dc777",运行到手机APP端和小程序端都是不生效,先闪过这个颜色#2dc777,最终还是变成黑色。在代码里也没有另外动态设置这个属性。项目用到了uview-plus框架。

2026-06-09 11:00 负责人:无 分享
已邀请:
DCloud_UNI_JBB

DCloud_UNI_JBB

试试新建一个空白 uniapp 项目有没有这个问题

  • 7***@qq.com (作者)

    新建空白的没问题,现在没找到问题出在哪里了

    2026-06-09 14:12

7***@qq.com

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

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'  
        });

要回复问题请先登录注册