微信小程序案例 - 自定义 tabBar

一、前言

微信小程序原生的 tabBar 提供了底部导航栏的基础功能,但其样式和交互受限,难以满足日益增长的 UI 设计需求。因此,越来越多的小程序项目选择使用 自定义 tabBar 来实现更灵活、更美观的底部导航。

本文将带你从零开始,手把手实现一个完整的 微信小程序自定义 tabBar 案例,包括:

✅ tabBar 的结构设计
✅ 动态切换页面
✅ 图标与文字高亮状态管理
✅ 样式美化与响应式适配
✅ 页面跳转逻辑处理
✅ 完整代码示例

并通过图文结合的方式帮助你掌握如何在实际项目中灵活应用自定义 tabBar。

二、为什么需要自定义 tabBar?

原生 tabBar 局限自定义 tabBar 优势
样式固定,无法修改图标大小、颜色等可自由定制样式
最多只能配置 5 个 tab 页灵活扩展,可做横向滚动
不支持中间凸起按钮支持自定义布局
难以集成动态数据可绑定数据、响应事件

三、项目目标

我们将实现一个类似美团风格的自定义 tabBar,包含以下功能模块:

模块功能描述
底部导航栏包含首页、分类、购物车、我的 四个 tab
图标+文字每个 tab 显示图标与文字
高亮状态切换当前 tab 图标与文字变色
页面切换点击 tab 切换对应页面内容
样式统一管理使用公共样式文件控制主题

四、项目结构说明

project/ ├── app.js ├── app.json ├── app.wxss ├── components/ │ └── custom-tab-bar/ │ ├── tab-bar.js │ ├── tab-bar.json │ ├── tab-bar.wxml │ └── tab-bar.wxss ├── pages/ │ ├── index/ │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── category/ │ ├── cart/ │ └── user/ └── utils/

我们通过封装一个组件 custom-tab-bar 实现底部导航栏,并在主页中调用该组件。

五、自定义 tabBar 组件实现

✅ 1. 创建组件目录

components/custom-tab-bar/ ├── tab-bar.js ├── tab-bar.json ├── tab-bar.wxml └── tab-bar.wxss

✅ 2. tab-bar.json(组件配置)

{ "component": true }

✅ 3. tab-bar.wxml(组件结构)

<view> <block wx:for="{{list}}" wx:key="index"> <viewactive' : ''}}" bindtap="switchTab" > <image src="{{currentIndex == index ? item.selectedIconPath : item.iconPath}}" mode="aspectFit"/> <text>{{item.text}}</text> </view> </block> </view>

✅ 4. tab-bar.wxss(组件样式)

.tab-bar { position: fixed; bottom: 0; left: 0; right: 0; height: 98rpx; display: flex; justify-content: space-around; align-items: center; background-color: #fff; border-top: 1rpx solid #eee; } .tab-bar-item { display: flex; flex-direction: column; align-items: center; justify-content: center; } .icon { width: 48rpx; height: 48rpx; margin-bottom: 6rpx; } .text { font-size: 24rpx; color: #666; } .tab-bar-item.active .text { color: #ff6600; }

✅ 5. tab-bar.js(组件逻辑)

Component({ properties: { list: { type: Array, value: [] }, currentIndex: { type: Number, value: 0 } }, methods: { switchTab(e) { const index = e.currentTarget.dataset.index; const path = e.currentTarget.dataset.path; this.triggerEvent('tabchange', { index, path }); } } });

六、在页面中使用自定义 tabBar

✅ 1. 引入组件

pages/index/index.json 中引入组件:

{ "usingComponents": { "custom-tab-bar": "/components/custom-tab-bar/tab-bar" } }

✅ 2. index.wxml 中使用组件

<view> <!-- 页面主体内容 --> <swiper current="{{currentTab}}" duration="300"> <swiper-item wx:for="{{tabPages}}" wx:key="index"> <block wx:if="{{currentTab == index}}"> <view wx:if="{{index == 0}}">首页内容</view> <view wx:if="{{index == 1}}">分类内容</view> <view wx:if="{{index == 2}}">购物车内容</view> <view wx:if="{{index == 3}}">我的内容</view> </block> </swiper-item> </swiper> <!-- 自定义 tabBar --> <custom-tab-bar list="{{tabList}}" currentIndex="{{currentTab}}" bind:tabchange="onTabChange" /> </view>

✅ 3. index.js 页面逻辑

Page({ data: { currentTab: 0, tabList: [ { text: '首页', iconPath: '/images/icon-home.png', selectedIconPath: '/images/icon-home-active.png', pagePath: 'index' }, { text: '分类', iconPath: '/images/icon-category.png', selectedIconPath: '/images/icon-category-active.png', pagePath: 'category' }, { text: '购物车', iconPath: '/images/icon-cart.png', selectedIconPath: '/images/icon-cart-active.png', pagePath: 'cart' }, { text: '我的', iconPath: '/images/icon-user.png', selectedIconPath: '/images/icon-user-active.png', pagePath: 'user' } ], tabPages: ['index', 'category', 'cart', 'user'] }, onTabChange(e) { const { index, path } = e.detail; this.setData({ currentTab: index }); // 可选:跳转到对应页面 // wx.navigateTo({ url: `/pages/${path}/${path}` }); } });

七、样式优化建议

✅ 1. 图标尺寸统一

  • 推荐使用 SVG 或 PNG 图标,统一尺寸为 48rpx x 48rpx
  • 高亮图标建议使用不同颜色区分

✅ 2. 文字颜色变化

  • 默认颜色 #666
  • 高亮颜色 #ff6600(橙色)或根据品牌色调整

✅ 3. 添加阴影效果(可选)

.tab-bar { box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1); }

八、实战扩展:中间凸起按钮(如“发布”按钮)

如果希望实现类似小红书或抖音的中间凸起按钮,可以修改 tab-bar.wxml 如下:

<view> <block wx:for="{{list}}" wx:key="index"> <viewactive' : ''}}" bindtap="switchTab" > <image src="{{currentIndex == index ? item.selectedIconPath : item.iconPath}}" mode="aspectFit"/> <text>{{item.text}}</text> </view> </block> <!-- 中间按钮 --> <view bindtap="onCenterClick"> <image src="/images/icon-publish.png" mode="aspectFit"/> <text>发布</text> </view> </view>

并在 tab-bar.wxss 中添加样式:

.center-button { position: absolute; top: -20rpx; left: 50%; transform: translateX(-50%); width: 100rpx; height: 100rpx; background-color: #ff6600; border-radius: 50%; display: flex; flex-direction: column; align-items: center; justify-content: center; color: #fff; z-index: 10; }

九、常见问题与解决方案

问题原因解决方案
tabBar 不显示组件未正确引入检查 usingComponents 配置
切换无反应未绑定 tabchange 事件检查事件监听是否正确
图标路径错误路径不正确使用绝对路径或检查层级关系
页面未更新数据未触发 setData检查数据绑定
无法点击中间按钮z-index 层级被遮挡设置更高 z-index

十、总结对比表:原生 vs 自定义 tabBar

特性原生 tabBar自定义 tabBar
样式灵活性
图标/文字自定义
中间凸起按钮
页面切换控制
多 tab 扩展能力
开发复杂度简单中等
维护成本中等

十一、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

Read more

将openclaw接入飞书:10分钟,让你的AI员工直接操作你的文档和表格!

将openclaw接入飞书:10分钟,让你的AI员工直接操作你的文档和表格!

上一篇,我们给小龙虾接了 Telegram,实现了手机遥控。 但说实话,Telegram 只解决了"能聊天"的问题。你跟小龙虾说"帮我写个文档",它写完了——然后呢?你还得自己复制粘贴到你的编辑器中。 这就像请了个助手,他只能站在门外隔着门跟你喊话,但不能进屋帮你干活。 今天这篇,我们把门打开。让小龙虾直接进入你的飞书——读文档、写文档、操作表格、管理日程,全部自己来。 先看效果👇 飞书的配置比 Telegram 多一些步骤,但别慌——跟着我走,每一步都有截图,大概10分钟搞定。 飞书的接入分四个阶段,先有个全局概念,不容易迷路: 1. 在飞书上造一个机器人 — 相当于给小龙虾办一张飞书工牌 2. 在服务器上装飞书插件 — 让小龙虾学会"说飞书的语言" 3.

人工智能大模型应用开发:从微调适配到场景落地

人工智能大模型应用开发:从微调适配到场景落地

一、人工智能大模型应用开发:从微调适配到场景落地 1.1 本章学习目标与重点 💡 掌握大模型应用开发的核心流程,包括模型选型、微调适配、功能封装、部署上线等关键环节; 💡 熟练运用主流大模型框架(Hugging Face Transformers、LangChain、LlamaIndex 等),实现文本生成、问答系统、智能助手等常见应用; 💡 理解大模型微调的核心技术(全参数微调、LoRA、QLoRA 等),能够根据数据规模和硬件资源选择合适的适配方案; 💡 通过真实场景案例(企业知识库问答、智能客服、代码生成助手),掌握大模型从技术适配到业务落地的端到端开发能力。 ⚠️ 重点关注:大模型的上下文窗口限制、生成内容的准确性与安全性、微调过程中的显存优化、以及生产环境下的性能与稳定性平衡。 1.2 大模型应用开发基础:选型与环境搭建 大模型应用开发的第一步是明确业务需求,选择合适的模型并搭建稳定的开发环境。本节将从模型选型原则、主流开发框架介绍、环境搭建实操三个维度,为后续开发奠定基础。 1.2.1

【AI】trae Skills使用方法

【AI】trae Skills使用方法

一、Skills是什么? Skill可以理解为agent的技能,Claude官方的解释是,使用 Skills 可以提升执行特定任务的能力。比如,可以在本地就能调用 Skills 玩转图片、Excel、Word、PDF 等处理操作,它和agent、mcp对比: 特性对比表格 特性SkillsSub-AgentsMCP (Model Context Protocol)目的用专业知识、工作流程、资源扩展 Claude生成自主代理处理复杂子任务连接外部工具和数据源调用方式模型自动发现(基于上下文)父代理显式生成MCP 服务器工具调用持久性触发时加载到上下文独立运行,返回结果无状态工具执行最适合领域专业知识、工作流程、模板并行任务、研究、探索外部 API、数据库、第三方服务上下文使用渐进式披露(元数据→指令→资源)每个子代理有独立上下文最小上下文(仅工具定义)复杂度低(只需 SKILL.md + 可选文件)中等(需要编排)中-高(

相干伊辛机在医疗领域及医疗AI领域的应用前景分析

相干伊辛机在医疗领域及医疗AI领域的应用前景分析

引言:当量子退火遇见精准医疗 21世纪的医疗健康领域正经历着一场由数据驱动的深刻变革。从基因组学到医学影像,从电子病历到可穿戴设备,医疗数据正以指数级增长。然而,海量数据的背后是经典的“组合爆炸”难题——例如,药物分子中电子的量子态搜索、多模态医疗影像的特征匹配、个性化治疗方案的组合优化等,这些问题对经典计算机,甚至对传统的超级计算机而言,都构成了难以逾越的计算壁垒。 相干伊辛机(Coherent Ising Machine, CIM)作为一种基于量子光学和量子退火原理的新型计算范式,为解决这类组合优化问题提供了全新的物理路径。它不同于通用量子计算机(如超导门模型),CIM是专为寻找复杂伊辛模型基态而设计的专用量子处理器。本文将深入探讨CIM如何凭借其强大的并行搜索能力,在药物研发、精准诊断、个性化治疗以及医疗AI优化等领域,从计算底层赋能医疗科技的未来。 一、 相干伊辛机:从统计物理到量子计算引擎 要理解CIM在医疗领域的潜力,首先需要深入其物理内核,厘清它如何通过光的相干性来高效解决现实世界的复杂问题。 1. 伊辛模型:组合优化的“通用语言” 伊辛模型最初源于统计物理学