Uniapp项目中解决一个比较典型的图标渲染问题:原生 tabBar(pages.json 里配置的那种)

文章目录

一,问题复现

niapp项目中出现以下问题:项目运行后,初始tabbar的每个图标都显示正常,但是一点击某个tabbar图标,另外的有的就不显示图标,「初始都正常、点一下后另外几个反而消失」

二,原因分析

这是用原生 tabBar(pages.json 里配置的那种)时比较典型的图标渲染问题。「初始都正常、点一下后另外几个反而消失」基本可以排除"路径完全写错"(那样一开始就不显示),更像是切换时重绘/重新加载图标失败。按出现概率从高到低排查:

  1. 图标尺寸或体积不标准(最常见)。uni-app 原生 tabBar 图标官方建议 81×81px、单张 ≤ 40KB、PNG。如果你后来替换过图标,尺寸过大或几张大小不一,切换重绘时就可能"有的加载得出、有的加载不出"。我生成的那套图标是符合规范的,先确认是不是换成了自己的大图。
  2. 我在 pages.json 给 tabBar 设了自定义 "height": "56px" 和 "fontSize": "10px"。个别端/编译器版本对自定义高度的重绘兼容不好,会让图标区域渲染异常。先把这两行删掉用默认值跑一遍,看是否恢复------这是针对当前这份配置最值得先试的一步。
  3. 编译缓存 / HBuilderX 版本问题。这类"切换后图标丢失"在某些 HBuilderX 版本确实是已知 bug。处理办法:关掉运行 → 删除项目里的 unpackage/dist 缓存目录 → 升级 HBuilderX 到最新版 → 重新编译运行。
  4. 真机/小程序的路径大小写。pages.json 里写的 home.png 必须和文件名大小写完全一致。Windows 下 H5 预览不区分大小写所以看着正常,到真机/小程序就可能个别图标失效。

建议顺序:先试 第 2 条(去掉自定义 height/fontSize),不行再清缓存升级(第 3 条)。

上面都试过还不行,最稳的兜底是改用自定义 tabBar("custom": true + 一个自绘的底部导航组件),用 image 标签自己渲染图标,彻底绕开原生 tabBar 的这个渲染问题。

三,H5 浏览器问题

诊断了H5标签栏图标消失的路由配置问题。

H5 的话,问题基本可以锁定在我给的路由配置上------是 manifest.json 里 H5 路由用了 history 模式 + 相对 base 导致的。

原理是这样:我在 manifest.json 写了

json 复制代码
"h5": {
  "router": { "mode": "history", "base": "./" }
}

history 模式下,点 tabBar 切页时浏览器地址会从 .../ 变成 .../pages/activity/activity 这种真实路径。而 tabBar 图标是相对路径 static/tabbar/xxx.png,它会跟着当前 URL 路径去解析,切页后就被解析到 .../pages/activity/static/tabbar/xxx.png 这种不存在的地址,于是 404、图标消失。这正好解释了"一开始(根路径下)都正常、一点击切页就有的没了",剩下没消失的多半是浏览器缓存还在。

3.1,修复方法一

最简单------把 H5 路由改回默认的 hash 模式,地址栏 # 前的路径始终不变,相对资源就不会错:

json 复制代码
"h5": {
  "router": { "mode": "hash", "base": "/" }
}

3.2,修复方法二

如果你确实要用 history 模式(比如为了 SEO/美观 URL),那就把 base 设成绝对路径 "/",并保证项目部署在域名根目录下:

json 复制代码
"router": { "mode": "history", "base": "/" }

改完清掉 unpackage/dist 缓存重新运行即可。

核心就是 manifest.json 里 H5 路由从 history 改成了 hash,切页后图标的相对路径就不会再错位。

相关推荐
多客:duokelijie23 分钟前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
视觉小萌新2 小时前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
码间留白7 小时前
鸿蒙端对接 BLE 血压计:从一次握手到读数入库(二)设备篇
物联网·uni-app·鸿蒙·蓝牙ble·血压计
翊众建站20 小时前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Patrick_Wilson1 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
华玥作者1 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app
FinelyYang1 天前
uniapp使用kkfileview在线预览ppt,excel,word,pdf类型文件
pdf·uni-app·powerpoint
2501_916008891 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
ModyQyW2 天前
vite-plugin-uni-manifest 0.7:在 uni-app 读取之前生成
前端·uni-app