最近遇到了些不太明显的bug,特此记录一下:
1.安卓深色模式导致字体变白色
背景:uni-app项目,同一套代码,有发布微信小程序,也有制作应用wgt包放在原生app里面。
问题:在app里面的下拉框,点开看不到内容,但能点击选择。微信小程序中正常显示。
解决过程:这个问题让我好一通找,因为本身出现问题的这个手机,是鸿蒙系统,之前开发的时候也会有别人都没有的bug。我又没办法拿他的手机调试,所以就一直在考虑是不是什么样式在鸿蒙上不兼容。后来实在想不出啥问题了,拿到他的手机,才发现,是可以点击选中的,就考虑是不是字体颜色不对了,然后换了背景色,原来是因为字体变成了白色,下拉框背景也是白色的,所以才看不见了。
原因:app根据系统模式,改成了暗黑模式,暗黑模式下,很多组件的字体颜色变成了白色,比如input、disable的button、和这次的uni-data-select。但背景也是白色,所以就看不见了。
解决办法:由于我们的ui本身就是以明亮色系为主,改成暗黑模式反而风格不统一,就让原生在进入wgt的设置中,固定成浅色模式,这样嵌套在原生的小程序,也就会固定成浅色模式了。(下图是暗黑和跟随系统,改成light就行了)。
2.系统大字体导致H5中picker组件失效
背景:嵌套在微信小程序的H5项目(umi@3.5+react@17+antd-mobile@5.20)。
问题:领导手机上,picker组件,选择日期时,在弹框里选择的日期-时间,确定后,回显的是比选择时小的时间或日期。且弹框里的日期根本不在选择的正中间显示。
原因:这部手机的微信调大了字体,导致picker的字体变大了,所以选中不准确或者没法选中。
解决:找了方法,设置了不跟随系统字体大小而改变(原文:H5字体大小不受用户手机设置影响的方法_禁止页面字体被机型字体影响-CSDN博客):
在src/pages/document.ejs里加了下面这段代码:
<script>
(function() {
if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
handleFontSize();
} else {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
} else if (document.attachEvent) {
document.attachEvent("onWeixinJSBridgeReady", handleFontSize);
}
}
function handleFontSize() {
// 设置网页字体为默认大小
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
// 重写设置网页字体大小的事件
WeixinJSBridge.on('menu:setfont', function() {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
});
}
})();
</script>
3.页面keepalive缓存导致H5先加载缓存页面的title
背景:嵌套在微信小程序中的H5项目(umi@3.5+react@17+antd-mobile@5.20)。每个小页面有自己的title,用<Helmet>标签包裹<title>。
问题:在弱网环境下,页面跳转时会先出现pageLoading页面,页面标题会先渲染一下之前某个页面的标题,再显示正常下一个页面(不同标题),这样会很奇怪。
解决:经过多次测试发现,只要打开过这个页面,再跳转其他页面,都会先渲染一下这个title,再渲染新页面的title。于是找这个页面与其他页面的不同之处,最后发现是缓存导致,删掉了这个页面的<KeepAlive>缓存就好了。
以上,这几个小bug一开始都不是很明显,且不方便调试,所以浪费了些时间。希望自己下次遇到同样问题能够快速定位,也能给大家提供些思路。