Tabs 标签页

代码演示

标签一

基础用法

Tabs标签页的基础用法;新增Tabs被右键点击事件

查看代码 < />

<template>
  <section class="tabs-demo">
      <div class="container">
        <w-tabs v-model="activeName1" @tab-click="handleClick" @mouse-right-click="handleMouseRightClick">
          <w-tab-pane label="标签一" name="first">标签一</w-tab-pane>
          <w-tab-pane label="第二标签" name="second">第二标签</w-tab-pane>
          <w-tab-pane label="标签三" name="third">标签三</w-tab-pane>
          <w-tab-pane label="标签四" name="fourth">标签四</w-tab-pane>
        </w-tabs>
      </div>
  </section>
</template>

<script>
export default {
    data () {
        return {
          activeName1: 'first'
        }
    },
    methods: {
      handleClick(tab, event) {
        console.log(tab, event)
      },
      handleMouseRightClick(tab, event) {
        event.preventDefault();
        console.log(tab, event)
      },
    },
}
</script>
标签一

可删除

设置 closable

查看代码 < />

<template>
  <section class="tabs-demo">
      <div class="container">
        <w-tabs v-model="editableTabsValue" @tab-click="handleClick" closable @tab-remove="handleRemove">
          <w-tab-pane :key="item.name"
                      v-for="item in editableTabs"
                      :label="item.title"
                      :name="item.name">
            {{item.content}}
          </w-tab-pane>
        </w-tabs>
      </div>
  </section>
</template>

<script>
export default {
    data () {
        return {
          editableTabsValue: '1',
          editableTabs: [{
            title: '标签一',
            name: '1',
            content: '标签一'
            }, {
            title: '标签二',
            name: '2',
            content: '标签二'
          }, {
            title: '标签三',
            name: '3',
            content: '标签三'
          }, {
            title: '标签四',
            name: '4',
            content: '标签四'
          }],
        }
    },
    methods: {
      handleClick(tab, event) {
        console.log(tab, event)
      },
      handleRemove(targetName) {
        let tabs = this.editableTabs;
        let activeName = this.editableTabsValue;
        if (activeName === targetName) {
          tabs.forEach((tab, index) => {
            if (tab.name === targetName) {
              let nextTab = tabs[index + 1] || tabs[index - 1];
              if (nextTab) {
                activeName = nextTab.name;
              }
            }
          });
        }
        this.editableTabsValue = activeName;
        this.editableTabs = tabs.filter(tab => tab.name !== targetName);
      },
    },
}
</script>
标签一

自定义图标

可以通过具名 slot 来实现自定义标签页的内容。

查看代码 < />

<template>
  <section class="tabs-demo">
    <div class="container">
      <w-tabs v-model="activeName2" @tab-click="handleClick">
        <w-tab-pane name="first">
          <span slot="label">
            <i class="w-icon-user"></i> 标签一
          </span>
          标签一
        </w-tab-pane>
        <w-tab-pane name="second">
          <span slot="label">
            <i class="w-icon-config"></i> 第二标签
          </span>
          第二标签
        </w-tab-pane>
        <w-tab-pane name="third">
          <span slot="label">
            <i class="w-icon-mark"></i> 标签三
          </span>
          标签三
        </w-tab-pane>
        <w-tab-pane name="fourth">
          <span slot="label">
            <i class="w-icon-edit-solid"></i> 标签四
          </span>
          标签四
        </w-tab-pane>
      </w-tabs>
    </div>
  </section>
</template>

<script>
export default {
  data () {
    return {
      activeName2: 'first'
    }
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event)
    }
  },
}
</script>
<style scoped lang="scss">
.tabs-demo {
  .container {
    width: 500px;
  }
}
</style>
脑卒中易患
标签一
标签一

滑动

可以左右、上下滑动,容纳更多标签。

查看代码 < />

<template>
  <section class="tabs-demo">
    <div class="box-card">
      <w-tabs v-model="activeName3" @tab-click="handleClick" type="border-card">
        <w-tab-pane label="脑卒中易患" name="first">脑卒中易患</w-tab-pane>
        <w-tab-pane label="脑卒中易患" name="second">脑卒中易患</w-tab-pane>
      </w-tabs>
    </div>
    <div class="box-horizontal">
      <w-tabs v-model="activeName4" @tab-click="handleClick">
        <w-tab-pane label="标签一" name="third">标签一</w-tab-pane>
        <w-tab-pane label="第二标签" name="fourth">第二标签</w-tab-pane>
        <w-tab-pane label="标签三" name="fifth">标签三</w-tab-pane>
        <w-tab-pane label="标签四" name="sixth">标签四</w-tab-pane>
        <w-tab-pane label="标签五" name="seventh">标签五</w-tab-pane>
        <w-tab-pane label="标签六" name="eighth">标签六</w-tab-pane>
      </w-tabs>
    </div>
    <div class="box-vertical">
      <w-tabs v-model="activeName5" @tab-click="handleClick"
        tab-position="left" style="height: 150px;">
        <w-tab-pane label="标签一" name="1">标签一</w-tab-pane>
        <w-tab-pane label="第二标签" name="2">第二标签</w-tab-pane>
        <w-tab-pane label="标签三" name="3">标签三</w-tab-pane>
        <w-tab-pane label="标签四" name="4">标签四</w-tab-pane>
        <w-tab-pane label="标签五" name="5">标签五</w-tab-pane>
        <w-tab-pane label="标签六" name="6">标签六</w-tab-pane>
      </w-tabs>
    </div>
  </section>
</template>

<script>
export default {
  data () {
    return {
      activeName3: 'first',
      activeName4: 'third',
      activeName5: '1'
    }
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event)
    }
  },
}
</script>
<style scoped lang="scss">
.tabs-demo {
  .box-card {
    width: 390px;
  }
  .box-horizontal {
    width: 500px;
    margin-top: 20px;
  }
  .box-vertical {
    margin-top: 20px;
  }
}
</style>
上
标签一
左
标签一
下
标签一
右
标签一

不同位置

根据tab-position设置标签的位置。

查看代码 < />

<template>
  <section class="tabs-demo">
      <div class="container">
        <div class="container__box">
          <div class="container__box--inner">
            <span class="demonstration">上</span>
            <w-tabs v-model="activeName1" @tab-click="handleClick" tab-position="top">
              <w-tab-pane label="标签一" name="1">标签一</w-tab-pane>
              <w-tab-pane label="第二标签" name="2">第二标签</w-tab-pane>
              <w-tab-pane label="标签三" name="3">标签三</w-tab-pane>
            </w-tabs>
          </div>
          <div class="container__box--inner">
            <span class="demonstration">左</span>
            <w-tabs v-model="activeName2" @tab-click="handleClick" tab-position="left">
              <w-tab-pane label="标签一" name="4">标签一</w-tab-pane>
              <w-tab-pane label="第二标签" name="5">第二标签</w-tab-pane>
              <w-tab-pane label="标签三" name="6">标签三</w-tab-pane>
            </w-tabs>
          </div>
        </div>
        <div class="container__box">
          <div class="container__box--inner">
            <span class="demonstration">下</span>
            <w-tabs v-model="activeName3" @tab-click="handleClick" tab-position="bottom">
              <w-tab-pane label="标签一" name="7">标签一</w-tab-pane>
              <w-tab-pane label="第二标签" name="8">第二标签</w-tab-pane>
              <w-tab-pane label="标签三" name="9">标签三</w-tab-pane>
            </w-tabs>
          </div>
          <div class="container__box--inner">
            <span class="demonstration">右</span>
            <w-tabs v-model="activeName4" @tab-click="handleClick" tab-position="right">
              <w-tab-pane label="标签一" name="10">标签一</w-tab-pane>
              <w-tab-pane label="第二标签" name="11">第二标签</w-tab-pane>
              <w-tab-pane label="标签三" name="12">标签三</w-tab-pane>
            </w-tabs>
          </div>
        </div>
      </div>
  </section>
</template>

<script>
export default {
  data () {
    return {
      activeName1: '1',
      activeName2: '4',
      activeName3: '7',
      activeName4: '10'
    }
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event)
    }
  },
}
</script>
<style scoped lang="scss">
.tabs-demo {
  .container {
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    .container__box {
      padding: 0;
      margin: 0 auto;
      flex: 1;
      border-right: 1px solid #eff2f6;
      &:last-child {
          border-right: none;
      }
      .container__box--inner {
        padding: 30px 20px;
        flex: 1;
        min-height: 150px;
        &:last-child {
          border-top: 1px solid #eff2f6;
        }
        .demonstration {
          display: block;
          color: #8492a6;
          font-size: 14px;
          margin-bottom: 20px;
        }
      }
    }
  }
}
</style>
标签一
标签三
第二标签

尺寸选择

根据size设置大小。

查看代码 < />

<template>
  <section class="tabs-demo">
    <w-radio-group v-model="size" size="small">
      <w-radio-button label="large">大</w-radio-button>
      <w-radio-button label="medium">中</w-radio-button>
      <w-radio-button label="small">小</w-radio-button>
    </w-radio-group>
    <div class="container">
      <w-tabs v-model="activeName1" @tab-click="handleClick" :size="size">
        <w-tab-pane label="标签一" name="1">标签一</w-tab-pane>
        <w-tab-pane label="第二标签" name="2">第二标签</w-tab-pane>
        <w-tab-pane label="标签三" name="3">标签三</w-tab-pane>
        <w-tab-pane label="标签四" name="4">标签四</w-tab-pane>
      </w-tabs>
      <w-tabs v-model="activeName2" @tab-click="handleClick" type="card" :size="size">
        <w-tab-pane label="标签一" name="5">标签一</w-tab-pane>
        <w-tab-pane label="第二标签" name="6">第二标签</w-tab-pane>
        <w-tab-pane label="标签三" name="7">标签三</w-tab-pane>
        <w-tab-pane label="标签四" name="8">标签四</w-tab-pane>
      </w-tabs>
      <w-tabs v-model="activeName3" @tab-click="handleClick" type="border-card" :size="size">
        <w-tab-pane label="标签一" name="9">标签一</w-tab-pane>
        <w-tab-pane label="第二标签" name="10">第二标签</w-tab-pane>
        <w-tab-pane label="标签三" name="11">标签三</w-tab-pane>
        <w-tab-pane label="标签四" name="12">标签四</w-tab-pane>
      </w-tabs>
    </div>
  </section>
</template>

<script>
export default {
  data () {
    return {
      size: 'large',
      activeName1: '1',
      activeName2: '7',
      activeName3: '10'
    }
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event)
    }
  },
}
</script>
<style scoped lang="scss">
.tabs-demo {
  .container {
    width: 450px;
    margin-top: 30px;
    .w-tabs {
      margin-bottom: 20px;
    }
  }
}
</style>
标签一
标签一

卡片式页签

根据card设置卡片式。

查看代码 < />

<template>
  <section class="tabs-demo">
      <div class="container">
        <w-tabs v-model="activeName1" @tab-click="handleClick" type="card">
          <w-tab-pane label="标签一" name="first">标签一</w-tab-pane>
          <w-tab-pane label="第二标签" name="second">第二标签</w-tab-pane>
          <w-tab-pane label="标签三" name="third">标签三</w-tab-pane>
          <w-tab-pane label="标签四" name="fourth">标签四</w-tab-pane>
        </w-tabs>
        <w-tabs v-model="activeName2" @tab-click="handleClick" type="dark">
          <w-tab-pane label="标签一" name="first">标签一</w-tab-pane>
          <w-tab-pane label="第二标签" name="second">第二标签</w-tab-pane>
          <w-tab-pane label="标签三" name="third">标签三</w-tab-pane>
          <w-tab-pane label="标签四" name="fourth">标签四</w-tab-pane>
        </w-tabs>
      </div>
  </section>
</template>

<script>
export default {
    data () {
        return {
          activeName1: 'first',
          activeName2: 'first'
        }
    },
    methods: {
      handleClick(tab, event) {
        console.log(tab, event)
      }
    },
}
</script>
<style scoped lang="scss">
.tabs-demo {
  .container {
    width: 450px;
    .w-tabs {
      margin-bottom: 30px;
    }
  }
}
</style>
标签二

新增与关闭

增减标签页按钮只能在选项卡样式的标签页下使用。

查看代码 < />

<template>
  <section class="tabs-demo">
    <w-radio-group v-model="size" size="small">
      <w-radio-button label="large">大</w-radio-button>
      <w-radio-button label="medium">中</w-radio-button>
      <w-radio-button label="small">小</w-radio-button>
    </w-radio-group>
    <div class="container">
      <w-tabs v-model="editableTabsValue" type="card"
        editable @edit="handleTabsEdit" :size="size">
        <w-tab-pane :key="item.name"
          v-for="item in editableTabs"
          :label="item.title"
          :name="item.name">
          {{item.content}}
        </w-tab-pane>
      </w-tabs>
    </div>
  </section>
</template>

<script>
export default {
  data () {
    return {
      size: 'large',
      editableTabsValue: '2',
      editableTabs: [{
        title: '标签一',
        name: '1',
        content: '标签一'
        }, {
        title: '标签二',
        name: '2',
        content: '标签二'
      }, {
        title: '标签三',
        name: '3',
        content: '标签三'
      }, {
        title: '标签四',
        name: '4',
        content: '标签四'
      }],
      tabIndex: 4
    }
  },
  methods: {
    handleTabsEdit(targetName, action) {
      if (action === 'add') {
        let newTabName = ++this.tabIndex + '';
        this.editableTabs.push({
          title: '新增 Tab',
          name: newTabName,
          content: '新增 Tab'
        });
        this.editableTabsValue = newTabName;
      }
      if (action === 'remove') {
        let tabs = this.editableTabs;
        let activeName = this.editableTabsValue;
        if (activeName === targetName) {
          tabs.forEach((tab, index) => {
            if (tab.name === targetName) {
              let nextTab = tabs[index + 1] || tabs[index - 1];
              if (nextTab) {
                activeName = nextTab.name;
              }
            }
          });
        }
        this.editableTabsValue = activeName;
        this.editableTabs = tabs.filter(tab => tab.name !== targetName);
      }
    }
  },
}
</script>
<style scoped lang="scss">
.tabs-demo {
  .container {
    margin-top: 20px;
  }
}
</style>

API

Tabs Attributes

参数 说明 类型 可选值 默认值 Version
addable 标签是否可增加 Boolean — false
before-leave 切换标签之前的钩子,若返回 false 或者返回 Promise 且被 reject,则阻止切换。 Function(activeName, oldActiveName) — —
closable 标签是否可关闭 Boolean — false
editable 标签是否同时可增加和关闭 Boolean — false
stretch 标签的宽度是否自撑开 Boolean - false
size 大小 String large/medium/small medium
type 风格类型 String card/border-card/dark —
tab-position 选项卡所在位置 String top/right/bottom/left top
value / v-model 绑定值,选中选项卡的 name String — 第一个选项卡的 name

Tabs Events

事件名称 说明 回调参数 Version
edit 点击 tabs 的新增按钮或 tab 被关闭后触发 (targetName, action)
tab-click tab 被选中时触发 被选中的标签 tab 实例
mouse-right-click tab 被右键点击时触发 被右键点击的标签 tab 实例 v1.5.11
tab-remove 点击 tab 移除按钮后触发 被删除的标签的 name
tab-add 点击 tabs 的新增按钮后触发 —

Tab-pane Attributes

参数 说明 类型 可选值 默认值 Version
closable 标签是否可关闭 Boolean — false
disabled 是否禁用 Boolean — false
label 选项卡标题 String — —
lazy 标签是否延迟渲染 Boolean — false
name 与选项卡绑定值 value 对应的标识符,表示选项卡别名 String — 该选项卡在选项卡列表中的顺序值,如第一个选项卡则为'1'

贡献者

类型 参与者
设计者 UED视觉组
维护者 UED前端组
上次更新: 3/19/2020, 3:52:58 PM