TabBar

优质
小牛编辑
129浏览
2023-12-01

1.10.0 新增

选项卡。

示例

如下示例相关代码在这里

CubeTabBar

支持默认的点击高亮效果,又支持下划线跟随的效果,并且支持自定义的插槽,实现icon与label搭配的类似于app底部选项卡的样式。

  • 默认样式

    传入如下 tabs 的数据结构便能初始化 cube-tab-bar,必须使用 v-model 指令来选中对应的 tab, v-model 的参数的值必须与某一项 tab 的 label 属性对应(1.12.5 版本后是和 value 属性对应),icon 属性是用做于 class 选择器,一般是用字体图标样式,cube-tab-bar 在不同的时机派发 clickchange 事件,参数则是每次选中的 tab 对应的 label 值(1.12.5 版本后是 value 值)。

    <template>
      <cube-tab-bar
        v-model="selectedLabelDefault"
        :data="tabs"
        @click="clickHandler"
        @change="changeHandler">
      </cube-tab-bar>
    </template>
    
    export default {
      data () {
        return {
          selectedLabelDefault: 'Vip',
          tabs: [{
            label: 'Home',
            icon: 'cubeic-home'
          }, {
            label: 'Like',
            icon: 'cubeic-like'
          }, {
            label: 'Vip',
            icon: 'cubeic-vip'
          }, {
            label: 'Me',
            icon: 'cubeic-person'
          }]
        }
      },
      methods: {
        clickHandler (label) {
          // if you clicked home tab, then print 'Home'
          console.log(label)
        },
        changeHandler (label) {
          // if you clicked different tab, this methods can be emitted
        }
      }
    }
    
  • 自定义插槽

    实际上我们更常见的需求是图标搭配文字效果,因此 cube-tab-bar 组件也支持了插槽的使用方式, 注意必须搭配 cube-tab 组件作为第一层级的子组件,来包裹你自定义插槽。

    <template>
      <cube-tab-bar
        v-model="selectedLabelSlots"
        show-slider
        inline
        @click="clickHandler">
        <cube-tab v-for="(item, index) in tabs" :label="item.label" :key="item.label">
          <!-- name为icon的插槽 -->
          <i slot="icon" :class="item.icon"></i>
          <!-- 默认插槽 -->
          {{item.label}}
        </cube-tab>
      </cube-tab-bar>
    </template>
    
    export default {
      data () {
        return {
          selectedLabelSlots: 'Like',
          tabs: [{
            label: 'Home',
            icon: 'cubeic-home'
          }, {
            label: 'Like',
            icon: 'cubeic-like'
          }, {
            label: 'Vip',
            icon: 'cubeic-vip'
          }, {
            label: 'Me',
            icon: 'cubeic-person'
          }]
        }
      },
      methods: {
        clickHandler (label) {
          // if you clicked home tab, then print 'Home'
          console.log(label)
        }
      }
    }
    

    同时还支持一些配置项, showSlider 控制是否开启下划线跟随的效果,inline 来决定icon与label是否处于一行,useTransition 控制下划线是否使用transition过渡,如示例代码所示。

CubeTabBar & CubeTabPanels

往往我们的需求是随着 tab 的切换显示不同的容器,这个时候需要搭配 cube-tab-panels 组件。cube-tab-panels 必须嵌套 cube-tab-panel,传入 cube-tabcube-tab-panel 的label值必须一致(1.12.5 版本后和 value 值一致),因为需要建立一个 tab 对应一个 panel 的关系。他们通过相同的 v-model 联动。查看效果可点击右边的 tab-basic 示例。

<template>
  <cube-tab-bar v-model="selectedLabel" show-slider>
    <cube-tab v-for="(item, index) in tabs" :icon="item.icon" :label="item.label" :key="item.label">
    </cube-tab>
  </cube-tab-bar>
  <cube-tab-panels v-model="selectedLabel">
    <cube-tab-panel v-for="(item, index) in tabs" :label="item.label" :key="item.label">
      <ul>
        <li class="tab-panel-li" v-for="(hero, index) in item.heroes">
          {{hero}}
        </li>
      </ul>
    </cube-tab-panel>
  </cube-tab-panels>
</template>
export default {
  data () {
    return {
      selectedLabel: '天辉',
      tabs: [{
        label: '天辉',
        icon: 'cubeic-like',
        heroes: ['敌法师', '卓尔游侠', '主宰', '米拉娜', '变体精灵', '幻影长矛手', '复仇之魂', '力丸', '矮人狙击手', '圣堂刺客', '露娜', '赏金猎人', '熊战士']
      }, {
        label: '夜魇',
        icon: 'cubeic-star',
        heroes: ['血魔', '影魔', '剃刀', '剧毒术士', '虚空假面', '幻影刺客', '冥界亚龙', '克林克兹', '育母蜘蛛', '编织者', '幽鬼', '司夜刺客', '米波']
      }]
    }
  }
}

事实上,cube-tab-bar 还能搭配许多其他cube-ui的组件(cube-slide ,cube-scroll)来做出类似原生 app 布局的效果。可点击右边的 ScrollTab Demotab-composite 示例来查看效果

Props 配置

  • CubeTabBar

    参数说明类型示例默认值
    value使用 v-model,初始化时选中对应的 tabString/Number--
    data用于 cube-tab-bar 渲染的数据,当需要使用内置的默认插槽,此参数必传,数组的每一项是一个 Object 类型,包括 labeliconvalue(默认值等于 label1.12.5+,如果使用自定义插槽,可不传此值Array[{label: 1, value: 1, icon: 'cubeic-like'}, {label: 2, value: 2, icon: 'cubeic-like'}][]
    showSlider是否开启下划线跟随效果Booleantrue/falsefalse
    inline文字与图标是否显示在一行Booleantrue/falsefalse
    useTransition是否开启 transition 过渡Booleantrue/falsetrue
  • CubeTab

    参数说明类型是否必传默认值
    label1.12.5 版本前作为哪个 tab 的值作为选中值,1.12.5 版本后主要用作展示String/Number-
    value用于判断哪个 tab 的值作为选中值1.12.5+String/Numberlabel 的值
  • CubeTabPanels

    参数说明类型示例默认值
    value使用 v-model,初始化时显示对应的 panelsString/Number--
    data用于 cube-tab-panels 渲染的数据,当需要使用内置的默认插槽,此参数必传,数组的每一项是一个 Object 类型,包括 labelvalue1.12.5+,如果使用自定义插槽,可不传此值Array[{label: 1, value: 1}, {label: 2, value: 2}][]
  • CubeTabPanel

    参数说明类型是否必传默认值
    label用于显示 panelString/Number-
    valuepanel 的 key 值,决定了选中的值1.12.5+String/Numbervalue 的值

插槽

  • CubeTab

    名称说明
    defaultcube-tab 渲染的文案
    icon一般是用来添加 icon 图标

事件

  • CubeTabBar

    事件名说明参数1
    click当 tab 被点击时派发点中的tab的label/value1.12.5+
    change当点击不同的 tab 时派发点中的tab的label/value1.12.5+

实例方法

  • CubeTabBar

    当该实例的 showSlider 属性设置为true,该方法才有效。

    方法名说明参数类型
    setSliderTransform改变 cube-tab-bar 组件的下划线的 transformX,如果传 Number,会转成像素,也可以传带有单位的 StringNumber/String