更新记录

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 不支持

注意

  1. nvue 版没有 sticky、插槽与系统主题实时监听(进入页面时读取一次),其余属性一致。
  2. 长标签在等分模式下超出选项宽度会显示省略号,需要完整展示时把 scroll 打开或调大 fontSize 对应的 itemHeight 宽度。
  3. 角标颜色固定为 #fa5151,需要换色请改 zeng-cross-tab.vue / zeng-cross-tab.nvue 里的 .ct__badge。
  4. 组件不申请任何系统权限、不采集任何数据、不含广告。

许可

MIT

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT License

Copyright (c) 2026 cross-tab contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

暂无用户评论。