更新记录
1.2.0(2026-11-10) 下载此版本
修复 Vue3 下的兼容问题
修复
v-model增加 Vue3 契约:新增modelValue属性,同时派发update:modelValue,Vue2(value/input)与 Vue3 双端可用- 子项
itemIndex改为读取容器注册顺序,不再依赖 Vue2 的$slots.defaultVNode 数组(Vue3 下所有项索引恒为 0,导致未写name时选中态错乱) - 子项
hasIconSlot/hasDefaultSlot同时兼容$slots.x为数组(Vue2)与函数(Vue3)的两种形态,插槽此前在 Vue3 下永远判定为空 - 子项补齐
beforeUnmount卸载钩子(原仅beforeDestroy,Vue3 下不注销,items 泄漏) - 子项图标 / 默认插槽节点改为始终渲染,小程序端
$slots探测不到时不再整块丢弃插槽内容;无图标时不再保留 4rpx 间距 - 小程序端补
multipleSlots: true,支持 icon + 默认两个具名插槽
平台兼容性
uni-app(3.8.10)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | - | √ | √ | √ | - | - |
o-tabbar
底部导航栏组件,由容器 o-tabbar 与子项 o-tabbar-item 组成。
适合自定义 tabBar、页面内二级切换、底部快捷入口等场景。图标复用库内 o-icon 内置字体(332 个图标),无需额外引入 iconfont。
特性
v-model双向绑定当前选中项,未传值时默认选中第一项- 图标支持 o-icon 图标名(如
home)与图片地址,未选中 / 选中可分别指定 - 角标
badge(数字超上限自动显示 99+)、小红点dot、单项 / 整组禁用 - 默认固定底部,自动生成等高空位(页面内容不被遮挡)并适配 iPhone 底部安全区
- 配色整组下发(
bg-color/color/active-color),子项可单独覆盖 - 子项支持
url跳转,tabBar 页自动走switchTab,其余走navigateTo icon作用域插槽,可完全自定义图标(插槽参数active表示是否选中)
基本用法
<o-tabbar v-model="active" @change="onChange">
<o-tabbar-item name="home" text="首页" icon="home" icon-ac="home-filled" />
<o-tabbar-item name="shop" text="商城" icon="shop" icon-ac="shop-filled" />
<o-tabbar-item name="cart" text="购物车" icon="cart" icon-ac="cart-filled" />
<o-tabbar-item name="user" text="我的" icon="user" icon-ac="user-filled" />
</o-tabbar>
export default {
data() {
return { active: 'home' }
},
methods: {
onChange(name) {
console.log('选中:', name)
}
}
}
子项未设置
name时,按默认插槽顺序取索引(从 0 开始),此时v-model绑定的值也是索引。
文字与图片图标
<!-- 纯文字:不传 icon -->
<o-tabbar v-model="active">
<o-tabbar-item name="all" text="全部" />
<o-tabbar-item name="todo" text="待付款" />
</o-tabbar>
<!-- 图片图标:地址含 . 或 / 时按图片渲染 -->
<o-tabbar v-model="active">
<o-tabbar-item name="home" text="首页" icon="/static/icon.png" icon-ac="/static/icon_ac.png" />
<o-tabbar-item name="me" text="我的" icon="/static/me.png" icon-ac="/static/me_ac.png" />
</o-tabbar>
也可以在子项里用默认插槽写文字,等价于 text:
<o-tabbar-item name="home" icon="home">首页</o-tabbar-item>
角标
<o-tabbar v-model="active">
<o-tabbar-item name="msg" text="消息" icon="chat-bubble" icon-ac="chat-bubble-filled" :badge="128" />
<o-tabbar-item name="cart" text="购物车" icon="cart" icon-ac="cart-filled" badge="new" badge-color="#409EFF" />
<o-tabbar-item name="user" text="我的" icon="user" icon-ac="user-filled" dot />
</o-tabbar>
badge为纯数字且大于badge-max(默认 99)时显示99+dot(小红点)与badge同时存在时,dot优先
配色
<!-- 深色 tabbar -->
<o-tabbar v-model="active" bg-color="#1f2329" color="#8f959e" active-color="#ffffff" :border="false">
<o-tabbar-item name="home" text="首页" icon="home" icon-ac="home-filled" />
<o-tabbar-item name="shop" text="商城" icon="shop" icon-ac="shop-filled" />
</o-tabbar>
图标颜色跟随文字色(currentColor),实心 / 线性图标都会自动适配,无需单独设置。
禁用
<!-- 单项禁用 -->
<o-tabbar-item name="shop" text="商城" icon="shop" disabled />
<!-- 整组禁用 -->
<o-tabbar v-model="active" disabled> ... </o-tabbar>
固定与安全区
默认 fixed + placeholder + safe-area 全开:组件固定在视口底部,同时在原位置生成一个「高度 + 安全区内边距」的占位块,页面滚动到底时内容不会被导航栏遮挡。
<!-- 嵌在卡片、弹层等局部区域演示时,关掉固定与占位 -->
<o-tabbar v-model="active" :fixed="false" :safe-area="false"> ... </o-tabbar>
自定义图标插槽
用 icon 具名插槽完全自定义图标,选中态跟随 v-model 的值联动(三端一致):
<o-tabbar v-model="active">
<o-tabbar-item name="a" text="方形">
<template #icon>
<view class="dot" :class="{ 'dot--on': active === 'a' }" />
</template>
</o-tabbar-item>
<o-tabbar-item name="b" text="圆形">
<template #icon>
<view class="dot dot--round" :class="{ 'dot--on': active === 'b' }" />
</template>
</o-tabbar-item>
</o-tabbar>
组件同时支持作用域插槽写法
<template #icon="{ active }">(H5 / App 可用,微信小程序端插槽作用域能力受限,建议用上面的 v-model 联动方式)。
v-model 兼容
o-tabbar 同时派发 input(Vue2)与 update:modelValue(Vue3)事件,v-model 在 Vue2 / Vue3 下都能正常工作:
<!-- Vue2 / Vue3 写法一致 -->
<o-tabbar v-model="active"> ... </o-tabbar>
<!-- 也可以手动监听 -->
<o-tabbar :value="active" @input="v => active = v" @change="onChange"> ... </o-tabbar>
oTabbar Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value / v-model | String / Number | '' |
当前选中项的 name,留空时默认选中第一项 |
| height | String | 100rpx |
单项高度(不含底部安全区),移动端约等于 50px |
| fixed | Boolean | true |
是否固定底部 |
| safe-area | Boolean | true |
是否适配 iPhone 底部安全区 |
| placeholder | Boolean | true |
固定时是否生成等高空位 |
| bg-color | String | #ffffff |
背景色 |
| color | String | #86909c |
未选中文字 / 图标颜色 |
| active-color | String | #409EFF |
选中文字 / 图标颜色 |
| border | Boolean | true |
顶部 1rpx 分隔线 |
| shadow | Boolean | false |
顶部投影(与 border 可按需二选一) |
| z-index | Number | 998 |
层级 |
| disabled | Boolean | false |
整组禁用 |
oTabbarItem Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| name | String / Number | '' |
唯一标识,留空按插槽顺序取索引 |
| text | String | '' |
文字内容(无默认插槽时生效) |
| icon | String | '' |
未选中图标:o-icon 图标名或图片地址 |
| icon-ac | String | '' |
选中图标,留空沿用 icon |
| icon-size | String / Number | 48rpx |
图标尺寸,纯数字按 rpx |
| badge | String / Number | '' |
角标内容 |
| badge-max | Number | 99 |
角标数字上限,超出显示 99+ |
| badge-color | String | #f56c6c |
角标背景色 |
| dot | Boolean | false |
小红点,优先于 badge |
| url | String | '' |
点击跳转地址 |
| disabled | Boolean | false |
禁用该项 |
| color | String | '' |
单独覆盖未选中颜色 |
| active-color | String | '' |
单独覆盖选中颜色 |
Events
| 事件 | 组件 | 说明 |
|---|---|---|
| input | o-tabbar | 选中值变化,配合 v-model 使用 |
| change | o-tabbar | 选中项发生变化时触发,参数 (name, item) |
| click | o-tabbar-item | 点击当前项,透传原始事件对象 |
Slots
| 插槽 | 组件 | 说明 |
|---|---|---|
| default | o-tabbar | 放置 o-tabbar-item |
| default | o-tabbar-item | 文字内容,优先于 text |
| icon | o-tabbar-item | 自定义图标,作用域参数 { active } |
平台说明
- 小程序端使用
styleIsolation: 'apply-shared',页面工具类可作用到组件内部 - 固定定位基于视口,若祖先节点使用了
transform/filter,position: fixed会相对该祖先定位,此时请改用:fixed="false"自行控制布局 - 底部安全区使用
env(safe-area-inset-bottom),不支持的端自动降级为 0

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 2209
赞赏 11
下载 12753694
赞赏 1959
赞赏
京公网安备:11010802035340号