更新记录
1.0.0(2026-10-28)
下载此版本
- 首个版本:以 csr-tab 的 API 为基线重构,value / tabList / rangeKey / bgColor / defaultColor / activeColor / scroll 与 change 事件保持兼容,老项目可平替。
- 新增 Vue3 支持(modelValue + update:modelValue),同一份代码兼容 Vue2 / Vue3。
- 新增 cross-tab.nvue,支持 app-nvue 页面,文字统一 包裹。
- 新增 mode:line / underline / pill / bold / none 五种指示样式。
- 新增角标(badge / count,>99 显示 99+)、禁用项(disabled)、图标(icon)。
- 新增 theme="auto" 暗黑模式跟随、sticky 吸顶、left / right 插槽。
- 新增横向滚动时选中项自动居中,以及 setCurrent(index, emitChange) 方法。
平台兼容性
uni-app(3.8.7)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
- |
- |
- |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
其他
| 多语言 |
暗黑模式 |
宽屏模式 |
蒸汽模式 |
| √ |
√ |
√ |
× |
cross-tab 多平台选项卡
csr-tab 的重构升级版。同一个 <zeng-cross-tab> 标签在 H5、App-vue、App-nvue、小程序 上表现一致,Vue2 / Vue3 项目都能直接 v-model。
相比 csr-tab 的改进
|
csr-tab 1.0.0 |
cross-tab |
| Vue2 / Vue3 |
仅 Vue2 |
双兼容,v-model、v-model:value 都可用 |
| app-nvue |
不支持(中文排版错乱) |
提供 zeng-cross-tab.nvue,文字统一 <text> 包裹 |
| 小程序端 |
仅微信 |
微信已适配,其余小程序按同一套跨端写法实现(未逐一实测) |
| 暗黑模式 |
不支持 |
theme="auto" 跟随系统,light/dark 手动指定 |
| 多语言 |
不支持 |
组件内无任何硬编码文案,标签全部来自数据 |
| 指示样式 |
只有底部一条 |
line 短横线 / underline 通栏 / pill 胶囊 / bold 加粗 / none |
| 角标 |
无 |
badge / count 字段自动渲染,>99 显示 99+ |
| 禁用项 |
无 |
disabled: true 置灰且不响应点击 |
| 横向滚动 |
只出滚动条 |
选中项自动滚到可视区中间,setCurrent 也会居中 |
| 数据源 |
需 rangeKey |
label/name/text/title/value 自动推断,rangeKey 仍可覆盖 |
| 吸顶 |
无 |
sticky 属性(H5 / 小程序 / app-vue) |
| 插槽 |
无 |
left / right 两个插槽放搜索、筛选等按钮 |
| 程序化控制 |
无 |
ref.setCurrent(index, emitChange) |
指示条采用「每个选项自带一条 + scaleX 缩放」的方式实现,不依赖 DOM 测量,因此小程序端不会出现首次进入定位偏移、异步测量抖动这类问题。
兼容性
| 平台 |
支持 |
说明 |
| H5 |
✅ |
已用 uni-app CLI(Vue3 + vite)真实编译并在浏览器逐项量测通过 |
| App-vue |
✅ |
与 H5 同一份代码路径,尚未真机验证 |
| App-nvue |
🟡 |
使用同目录 zeng-cross-tab.nvue,无 sticky 与插槽;未在真机验证,package.json 标记 u |
| 微信小程序 |
🟡 |
含 darkmode 配置写法;未在开发者工具验证,package.json 标记 u |
| 支付宝 / 百度 / 头条 / QQ / 快手 / 京东 小程序 |
🟡 |
按跨端写法实现,未验证(package.json 标记 u) |
| uni-app x(uvue) |
❌ |
需要单独一套 uvue 实现,本插件不含 |
| Vue2 / Vue3 |
✅ |
模板在 vue-template-compiler 2.6.14 与 @vue/compiler-sfc 3.4.21 下均编译通过;组件只用 Options API 与两端通用样式能力 |
🟡 = 按各端能力约束实现,尚未在该端实测;发布前建议至少跑一遍微信开发者工具与 iOS/Android 真机。
快速开始
# 方式一:HBuilderX 菜单「插件市场」导入 uni_modules
# 方式二:把 uni_modules/zeng-cross-tab 整个目录拷到项目根下的 uni_modules/ 里
无需注册,easycom 自动引入:
<template>
<zeng-cross-tab v-model="current" :tab-list="tabs" @change="onChange" />
</template>
<script>
export default {
data() {
return {
current: 0,
tabs: ['热帖推荐', '最新帖子', '最多访问', '最多回复']
}
},
methods: {
onChange(index, item) {
console.log(index, item)
}
}
}
</script>
对象数组(角标、禁用、图标):
tabs: [
{ name: '关注', badge: 6 },
{ name: '推荐', badge: 128 }, // 自动显示 99+
{ name: '同城', icon: '📍' }, // icon 支持 emoji 或 iconfont 字符
{ name: '草稿', disabled: true } // 置灰不可点
]
<zeng-cross-tab v-model="current" :tab-list="tabs" range-key="name" mode="pill" />
与 swiper 联动
<template>
<zeng-cross-tab ref="tab" :value="current" :tab-list="tabs" @change="onTab" />
<swiper :current="current" @change="onSwiper">
<swiper-item v-for="(item, i) in tabs" :key="i">{{ item }} 的内容</swiper-item>
</swiper>
</template>
<script>
export default {
data: () => ({ current: 0, tabs: ['A', 'B', 'C'] }),
methods: {
onTab(index) {
this.current = index
},
onSwiper(e) {
this.current = e.detail.current
}
}
}
</script>
属性
| 属性名 |
类型 |
默认值 |
说明 |
| value / modelValue |
Number | String |
0 |
当前下标,Vue2 用 v-model、Vue3 用 v-model 或 v-model:value 均可 |
| tabList |
Array |
[] |
一维数组或对象数组 |
| rangeKey |
String |
'' |
对象数组的显示字段;不传时自动取 label/name/text/title/value |
| mode |
String |
line |
line 短横线 / underline 通栏横线 / pill 胶囊底色 / bold 仅变色加粗 / none 无指示 |
| scroll |
Boolean |
false |
横向滚动,选中项自动居中 |
| equalDivide |
Boolean |
true |
非滚动时是否等分宽度;false 则按内容自适应、从左往右排列 |
| showBadge |
Boolean |
true |
是否渲染角标 |
| bold |
Boolean |
true |
选中文字是否加粗 |
| sticky |
Boolean |
false |
吸顶(nvue 不支持) |
| stickyTop |
Number / String |
0 |
吸顶时距页面顶部的偏移,数字按 rpx、字符串原样使用;H5 有固定导航栏时设成导航栏高度,如 44px |
| bgColor |
String |
'' |
背景色,默认跟随主题 |
| defaultColor |
String |
'' |
未选中文字颜色,默认跟随主题 |
| activeColor |
String |
'' |
选中文字与指示条颜色,默认跟随主题 |
| theme |
String |
auto |
auto 跟随系统 / light / dark |
| fontSize |
Number | String |
28 |
字号,数字按 rpx |
| itemHeight |
Number | String |
88 |
选项卡高度,数字按 rpx |
| lineWidth |
Number | String |
60% |
指示条宽度,支持 40rpx、60%(相对选项宽度) |
| lineHeight |
Number | String |
6 |
指示条高度,数字按 rpx |
| duration |
Number | String |
240 |
动画时长(ms),传 0 关闭动画 |
事件
| 事件名 |
回调参数 |
说明 |
| change |
(index, item) |
点击切换时触发,item 是 tabList 里对应的原始数据 |
| input |
(index) |
Vue2 v-model 绑定值更新 |
| update:value / update:modelValue |
(index) |
Vue3 与显式绑定更新 |
方法
| 方法名 |
参数 |
说明 |
| setCurrent |
(index, emitChange = false) |
程序化切换下标;emitChange 为 true 时同时抛 change 事件并触发滚动居中 |
插槽
| 插槽名 |
说明 |
| left / right |
选项卡左右两侧的固定区域,nvue 不支持 |
注意
- nvue 版没有
sticky、插槽与系统主题实时监听(进入页面时读取一次),其余属性一致。
- 长标签在等分模式下超出选项宽度会显示省略号,需要完整展示时把
scroll 打开或调大 fontSize 对应的 itemHeight 宽度。
- 角标颜色固定为
#fa5151,需要换色请改 zeng-cross-tab.vue / zeng-cross-tab.nvue 里的 .ct__badge。
- 组件不申请任何系统权限、不采集任何数据、不含广告。
许可
MIT