
后端物联网语音人工智能AI 应用AI AgentRAG【免费下载链接】xiaozhi-esp32-server本项目为xiaozhi-esp32提供后端服务帮助您快速搭建ESP32设备控制服务器。Backend service for xiaozhi-esp32, helps you quickly build an ESP32 device control server.项目地址https://gitcode.com/gh_mirrors/xia/xiaozhi-esp32-server点击查看免费下载本文围绕小智 ESP32 服务端移动端管理应用manager-mobile中底部导航栏tabbar的四种实现策略展开系统讲解「无 tabbar」「原生 tabbar」「有缓存自定义 tabbar」「无缓存自定义 tabbar」四种方案的能力边界、优缺点与源码级实现细节。读者读完可以掌握该模板中 tabbar 策略的切换方式、tabbarList.ts的核心配置字段、图标渲染机制以及页面缓存与路由切换的底层原理从而为自己的 uni-app 项目选型并落地合适的底部导航方案。一、背景tabbar 在 Manager-Mobile 中的位置在小智 ESP32 服务端项目中manager-mobile 是基于 uni-appVue 3 TypeScript构建的移动端管理应用主要包含首页、配网、系统设置等页面。其底部导航栏的实现集中收敛在一个独立目录中main/manager-mobile/src/layouts/fg-tabbar/ ├── fg-tabbar.vue # 自定义 tabbar 渲染组件 ├── tabbar.md # 四种策略说明文档本文核心依据 ├── tabbar.ts # tabbar 选中状态reactive storageSync └── tabbarList.ts # 策略开关、tabbar 列表与 pages.json tabBar 配置其中 tabbar.md 明确了 tabbar 分为4 种情况策略分别用数字 0、1、2、3 标识而 tabbarList.ts 中的TABBAR_MAP常量正是这四种策略的程序化映射。二者一一对应是理解整个 tabbar 体系的钥匙。二、四种 tabbar 策略总览根据 tabbar.md四种策略的核心差异集中在三个维度是否显示底部导航栏、页面是否有缓存、切换底层 APIswitchTab还是navigateTo。策略值名称切换 API页面缓存导航栏形态0无 tabbar无单页面入口无底部不显示 tabbar1原生 tabbarswitchTab有系统原生 tabbar2有缓存自定义 tabbarswitchTab有第三方 UI 库 tabbar 组件隐藏原生 tabbar3无缓存自定义 tabbarnavigateTo无第三方 UI 库 tabbar 组件在源码 tabbarList.ts 中四种策略被定义为export const TABBAR_MAP { NO_TABBAR: 0, // 无 tabbar NATIVE_TABBAR: 1, // 完全原生 tabbar CUSTOM_TABBAR_WITH_CACHE: 2, // 有缓存自定义 tabbar CUSTOM_TABBAR_WITHOUT_CACHE: 3, // 无缓存自定义 tabbar } // TODO通过这里切换使用tabbar的策略 export const selectedTabbarStrategy TABBAR_MAP.NATIVE_TABBAR当前仓库默认启用的是策略 1原生 tabbar开发者只需修改selectedTabbarStrategy这一处即可在四种策略间切换。三、策略 0无 tabbar临时活动页场景适用场景只有一个页面入口底部不显示任何 tabbar常用于临时活动页、落地页、引导页等单页场景。优势页面形态最纯粹不受底部导航约束适合全屏沉浸式展示注意点此策略下tabbarList不生效源码注释明确标注「NO_TABBAR(0) 时tabbarList 不生效」。从实现上看当selectedTabbarStrategy 0时tabbarList.ts 中cacheTabbarEnable为false因此最终导出的tabBar为undefinedpages.json中不会生成tabBar配置也就不会渲染任何底部导航// 0和1 需要显示底部的tabbar的各种配置以利用缓存 export const tabBar cacheTabbarEnable ? _tabbar : undefined四、策略 1原生 tabbar默认策略适用场景页面结构稳定、追求首屏渲染速度与性能的常规业务 App。原生 tabbar 是框架uni-app / 微信小程序等内置的底部导航通过switchTab进行页面切换优势原生自带最先渲染加载最快页面有缓存切换不丢失状态劣势图标只能使用 2 组图片未选中iconPath与选中selectedIconPath来切换状态修改颜色只能重新替换图片或借助 iconfont 变通扩展定制能力有限。对应源码配置位于 tabbarList.tsconst _tabbar: TabBar { // 只有微信小程序支持 custom。App 和 H5 不生效 custom: selectedTabbarStrategy TABBAR_MAP.CUSTOM_TABBAR_WITH_CACHE, color: #e6e6e6, selectedColor: #667dea, backgroundColor: #fff, borderStyle: black, height: 50px, fontSize: 10px, iconWidth: 24px, spacing: 3px, list: tabbarList as unknown as TabBar[list], }原生策略下每个 tab 项需要提供两张图片。仓库中已内置三组 tab 图标static/tabbarrobot/robot_activate首页、network/network_activate配网、system/system_activate系统分别对应iconPath与selectedIconPath字段。说明策略 1 与策略 2 均通过switchTab切换因此cacheTabbarEnable在两者下都为true从而保证pages.json生成原生tabBar配置以复用框架缓存能力。五、策略 2有缓存自定义 tabbar适用场景既需要switchTab带来的页面缓存又希望拥有高度可定制的图标、配色与动效。该策略使用第三方 UI 库本项目为 wot-design-uni 的wd-tabbar渲染自定义 tabbar并隐藏原生 tabbar的显示优势可随意配置自己想要的 SVG icon切换字体颜色方便页面有缓存可以实现各种自定义动效劣势首次点击 tabbar 会闪烁自定义组件渲染与页面切换存在时序差。自定义 tabbar 的渲染在 fg-tabbar.vue 中完成切换逻辑如下function selectTabBar({ value: index }: { value: number }) { const url tabbarList[index].path tabbarStore.setCurIdx(index) if (cacheTabbarEnable) { uni.switchTab({ url }) // 策略 2有缓存 } else { uni.navigateTo({ url }) // 策略 3无缓存 } }同时页面onLoad时会主动隐藏原生 tabbar避免出现「两个 tabbar 叠加」的问题onLoad(() { // 解决原生 tabBar 未隐藏导致有2个 tabBar 的问题 const hideRedundantTabbarEnable selectedTabbarStrategy TABBAR_MAP.CUSTOM_TABBAR_WITH_CACHE hideRedundantTabbarEnable uni.hideTabBar({ fail(err) { console.log(hideTabBar fail: , err) }, success(res) { console.log(hideTabBar success: , res) }, }) })此外需注意custom: true的custom字段只有微信小程序支持App 端与 H5 端不生效见 tabbarList.ts 注释。六、策略 3无缓存自定义 tabbar适用场景同样需要自定义图标与配色但可以接受页面状态不保留的轻量场景。优势可随意配置 SVG icon切换字体颜色方便可实现自定义动效劣势首次点击 tabbar 会闪烁且页面无缓存——因为底层使用的是navigateTo每次切换都会重新创建页面实例而非switchTab。从代码逻辑看策略 3 与策略 2 在渲染层完全一致都走wd-tabbar唯一区别是cacheTabbarEnable为false从而切换走uni.navigateTo分支。该策略适合对状态保留要求不高的页面组合避免因缓存带来额外内存开销。七、核心配置详解tabbarList.tstabbarList.ts 是整个 tabbar 体系的「总控文件」承担三类职责策略开关、列表数据、pages.json 的 tabBar 注入。7.1 列表数据结构与图标类型type FgTabBarItem TabBar[list][0] { icon: string iconType: uiLib | unocss | iconfont }当前内置的三个 tab 项tabbarList.ts页面文本原生图标iconPath / selectedIconPath自定义图标icon / iconTypepages/index/index首页robot.png / robot_activate.pnghome / uiLibpages/device-config/index配网network.png / network_activate.pngi-carbon-network-3 / uiLibpages/settings/index系统system.png / system_activate.pngi-carbon-settings / uiLib源码注释明确了三条配置约定tabbarList.ts策略 1原生时需要填iconPath和selectedIconPath两张图片策略 2/3自定义时需要填icon和iconType策略 0无 tabbar时tabbarList不生效。7.2 四种图标渲染方式在 fg-tabbar.vue 模板中wd-tabbar-item根据iconType分四种情况渲染图标uiLib直接使用 UI 框架wot-design-uni自带的 icon 组件如:iconitem.iconunocss使用 UnoCSS 原子类h-40rpx w-40rpx配合图标类名并通过is-active/is-inactive切换选中态样式iconfont使用 iconfont 字体图标同样以 class 方式渲染local使用本地图片资源通过image :srcitem.icon /渲染。值得注意的是模板中还支持了文档未单独列出的local本地图片渲染分支说明自定义 tabbar 的图标方案实际上比文档列举的 svg/iconfont 更灵活还可以直接放本地图片。7.3 缓存开关与 tabBar 注入// NATIVE_TABBAR(1) 和 CUSTOM_TABBAR_WITH_CACHE(2) 时需要tabbar缓存 export const cacheTabbarEnable selectedTabbarStrategy TABBAR_MAP.NATIVE_TABBAR || selectedTabbarStrategy TABBAR_MAP.CUSTOM_TABBAR_WITH_CACHEcacheTabbarEnable是一个派生开关只有策略 1、2 为true。它同时决定了三件事——switchTab分支、原生 tabbar 是否显示、以及pages.json中是否注入tabBar配置。八、页面状态管理tabbar.ts自定义 tabbar 的选中索引由一个轻量状态对象维护tabbar.tsexport const tabbarStore reactive({ curIdx: uni.getStorageSync(app-tabbar-index) || 0, setCurIdx(idx: number) { this.curIdx idx uni.setStorageSync(app-tabbar-index, idx) }, })这里有两个设计要点刻意不用 Pinia注释明确说明「使用 reactive 简单状态而不是 pinia 全局状态」因为 tabbar 索引是极简的 UI 状态引入全局 store 反而增加复杂度storageSync 持久化每次设置curIdx都会同步写入app-tabbar-index这样刷新浏览器H5 端或重启小程序时能恢复到正确的 tabbar 页面避免「刷新后回到默认页」的体验断裂。九、与 pages.config.ts 的集成uniapp 项目中页面与 tabBar 的声明通过 pages.config.ts 完成该文件在构建时生成pages.jsonimport { defineUniPages } from uni-helper/vite-plugin-uni-pages import { tabBar } from ./src/layouts/fg-tabbar/tabbarList export default defineUniPages({ // ... // tabbar 的配置统一在 ./src/layouts/fg-tabbar/tabbarList.ts 文件中 tabBar: tabBar as any, })由此形成了一条清晰的配置链路tabbarList.ts策略 列表 tabBar 对象 └── pages.config.ts注入 tabBar → 生成 pages.json └── 页面路由声明与原生 tabbar 渲染源码在 tabbarList.ts 中给出了一条重要提醒本文件的任何代码更改之后都需要重新运行重新构建否则pages.json不会更新导致错误。这是切换策略时最常见的坑务必牢记。十、布局集成default.vue 与 tabbar.vue项目中存在两套布局src/layoutsdefault.vue仅提供wd-config-provider、wd-toast、wd-message-box等全局能力不渲染 tabbartabbar.vue在 default 基础上额外引入FgTabbar /组件fg-tabbar.vue用于自定义 tabbar 策略的页面布局。在 fg-tabbar.vue 中只有当策略为 2 或 3自定义 tabbar时才渲染wd-tabbar组件const customTabbarEnable selectedTabbarStrategy TABBAR_MAP.CUSTOM_TABBAR_WITH_CACHE || selectedTabbarStrategy TABBAR_MAP.CUSTOM_TABBAR_WITHOUT_CACHEwd-tabbar开启safe-area-inset-bottom安全区适配、bordered、placeholder、fixed等属性兼顾 iPhone 底部安全区与页面占位避免内容被固定导航遮挡。十一、路由拦截器对 tabbar 切换的兼容项目在 router/interceptor.ts 中注册了全局路由拦截器基于黑名单的登录拦截并通过uni.addInterceptor同时拦截了navigateTo、reLaunch、redirectTo、switchTab四种跳转方式uni.addInterceptor(navigateTo, navigateToInterceptor) uni.addInterceptor(reLaunch, navigateToInterceptor) uni.addInterceptor(redirectTo, navigateToInterceptor) uni.addInterceptor(switchTab, navigateToInterceptor)这意味着无论采用switchTab策略 1/2还是navigateTo策略 3进行 tab 切换都会被登录拦截逻辑统一覆盖切换 tabbar 策略不会造成路由鉴权漏洞且拦截器对 url 做了规范化处理相对路径转绝对路径与 fg-tabbar.vue 中「path 从 pages.config.ts 得到并补全/前缀」的约定一致。十二、实操指南如何切换与验证结合源码切换 tabbar 策略只需两步修改策略开关在 tabbarList.ts 中修改selectedTabbarStrategy为TABBAR_MAP中的 0/1/2/3 之一重启/重新构建项目由于pages.json由构建期生成修改后必须重新运行否则配置不生效。同时按策略补齐字段策略 1确认每个 tab 项都填了iconPath与selectedIconPath图片位于 static/tabbar策略 2/3确认填了icon与iconType并根据uiLib/unocss/iconfont/local四种类型准备对应的图标资源策略 2微信小程序端生效custom: trueApp/H5 端不生效需注意平台差异。十三、选型建议与总结结合文档的优劣势说明与源码实现四种策略的选型建议如下策略 0无 tabbar仅用于单页入口、临时活动页、引导页等场景策略 1原生 tabbar默认推荐。追求首屏性能与页面缓存对图标样式要求不高时优先选择代价是定制能力弱仅两组图片策略 2有缓存自定义需要「缓存 高度定制」时的最佳折中代价是首次点击闪烁、且custom配置在微信小程序外不生效策略 3无缓存自定义当页面无需保留状态、且希望自定义能力最大化时使用代价是每次切换都会重建页面。总结来看小智 ESP32 服务端的 manager-mobile 通过 tabbarList.ts 这一个「策略总控」文件将四种 tabbar 方案的切换成本压缩到了极致一处常量、一次重启、按策略补齐图标字段即可完成切换。这种「配置驱动、组件收敛」的设计配合switchTab/navigateTo的 API 差异与storageSync的状态持久化为同类 uni-app 项目的底部导航实现提供了一个结构清晰、易于维护的参考范本。至于动效等「花里胡哨」的效果正如 tabbar.md 末尾的提示所说需要开发者自行实现模板本身并不提供。赞分享后端物联网语音人工智能AI 应用AI AgentRAG【免费下载链接】xiaozhi-esp32-server本项目为xiaozhi-esp32提供后端服务帮助您快速搭建ESP32设备控制服务器。Backend service for xiaozhi-esp32, helps you quickly build an ESP32 device control server.项目地址https://gitcode.com/gh_mirrors/xia/xiaozhi-esp32-server点击查看免费下载相关推荐awesome-opensource-documents开发者宝典20个必备编程语言文档和最佳实践awesome opensource documents开发者宝典20个必备编程语言文档和最佳实践 awesome opensource documents是uPlot缓存策略本地存储与服务端缓存结合方案uPlot缓存策略本地存储与服务端缓存结合方案 你是否在使用uPlot时遇到过大量时间序列数据加载缓慢的问题是否想过如何在保证图表渲染速度的同时减少不必要前端图表库数据可视化roadmap.sh缓存策略服务端与客户端缓存roadmap.sh缓存策略服务端与客户端缓存 概述 roadmap.sh作为开发者学习平台采用了多层缓存策略来优化性能并提升用户体验。本文将深入分析其服务文档教程知识库上一篇MongoDB内存服务器使用教程下一篇NgRx 数据管理在Angular中的实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考