为什么需要自定义 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/
│ ├── 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 class="tab-bar">
<block wx:for="{{list}}" wx:key="index">
<view
class="tab-bar-item {{currentIndex == index ? 'active' : ''}}"
bindtap="switchTab"
data-index="{{index}}"
data-path="{{item.pagePath}}">
<image src="{{currentIndex == index ? item.selectedIconPath : item.iconPath}}" mode="aspectFit" class="icon"/>
<text class="text">{{item.text}}</text>
</view>
</block>
</view>

