Element UI 的 Tabs 标签页开发教程

1. 基础用法(静态标签页)

最基础的标签页由外层 <el-tabs>和内层多个 <el-tab-pane>组成。通过 v-model绑定当前激活页的 name

代码示例:

复制代码
<template>
  <el-tabs v-model="activeName" @tab-click="handleClick">
    <!-- 标签页1 -->
    <el-tab-pane label="用户管理" name="first">
      这里是用户管理的内容
    </el-tab-pane>
    <!-- 标签页2 -->
    <el-tab-pane label="配置管理" name="second">
      这里是配置管理的内容
    </el-tab-pane>
    <!-- 标签页3(禁用) -->
    <el-tab-pane label="角色管理" name="third" :disabled="true">
      这里是角色管理的内容
    </el-tab-pane>
  </el-tabs>
</template>

<script>
export default {
  data() {
    return {
      activeName: 'first' // 默认激活第一个标签
    };
  },
  methods: {
    handleClick(tab) {
      console.log('切换到标签:', tab.name);
    }
  }
};
</script>

核心属性说明:

  • v-model="activeName" :双向绑定,activeName的值对应某个 el-tab-panename

  • label:标签页显示的名称。

  • name:标签页的唯一标识符(必填)。

  • disabled:禁用该标签页。

2. 进阶样式与布局

2.1 卡片风格 (Card Style)

通过设置 type属性,可以改变标签页的外观,常用于更紧凑的布局。

复制代码
<!-- 普通卡片风格 -->
<el-tabs v-model="activeName" type="card">
  <el-tab-pane label="Tab1" name="1">内容1</el-tab-pane>
  <el-tab-pane label="Tab2" name="2">内容2</el-tab-pane>
</el-tabs>

<!-- 带边框的卡片风格 -->
<el-tabs type="border-card">
  <el-tab-pane label="Tab1">内容1</el-tab-pane>
  <el-tab-pane label="Tab2">内容2</el-tab-pane>
</el-tabs>
2.2 标签位置 (Position)

通过 tab-position属性,可以将标签栏放置在容器的左侧、右侧、顶部(默认)或底部。注意:左右布局时通常需要手动设置容器高度。

复制代码
<el-tabs v-model="activeName" tab-position="left" style="height: 300px;">
  <el-tab-pane label="左侧导航1" name="1">内容1</el-tab-pane>
  <el-tab-pane label="左侧导航2" name="2">内容2</el-tab-pane>
</el-tabs>

3. 动态增减标签页(高级功能)

在需要动态管理标签(如浏览器标签页)的场景下,可以使用 editable属性配合数组渲染。

实现步骤:

  1. editable设为 true,监听 @edit事件。

  2. 使用数组 tabsList循环渲染 el-tab-pane

  3. handleEdit方法中根据 action('add' 或 'remove')操作数组。

代码示例:

复制代码
<template>
  <el-tabs 
    v-model="activeTab" 
    type="card" 
    :editable="true" 
    @edit="handleEdit">
    
    <el-tab-pane 
      v-for="tab in tabsList" 
      :key="tab.name"
      :label="tab.title" 
      :name="tab.name"
      :closable="tab.closable">
      {{ tab.content }}
    </el-tab-pane>
  </el-tabs>
</template>

<script>
export default {
  data() {
    return {
      activeTab: '1',
      tabIndex: 1,
      tabsList: [{
        title: '初始标签',
        name: '1',
        content: '初始内容',
        closable: false // 第一个标签不可关闭
      }]
    };
  },
  methods: {
    handleEdit(targetName, action) {
      if (action === 'add') {
        // 添加新标签
        this.tabIndex++;
        const newTab = {
          title: '新标签' + this.tabIndex,
          name: this.tabIndex.toString(),
          content: '新内容',
          closable: true
        };
        this.tabsList.push(newTab);
        this.activeTab = newTab.name;
        
      } else if (action === 'remove') {
        // 删除标签
        let tabs = this.tabsList;
        if (tabs.length <= 1) {
          alert('至少保留一个标签页');
          return;
        }
        this.tabsList = tabs.filter(tab => tab.name !== targetName);
        // 如果删除的是当前激活页,自动激活最后一个
        if (this.activeTab === targetName) {
          this.activeTab = this.tabsList[this.tabsList.length - 1].name;
        }
      }
    }
  }
};
</script>

4. 性能优化与懒加载

如果某个标签页内容非常复杂(如包含大型表格或图表),可以使用 lazy属性实现懒加载。只有切换到该标签时才会渲染内容,避免页面初始化卡顿。

复制代码
<el-tab-pane label="大数据报表" name="report" :lazy="true">
  <!-- 这里可能是很重的组件 -->
  <heavy-chart-component />
</el-tab-pane>

5. 注意事项与常见问题

  1. name属性必填v-model绑定的是 name,不是 labelname推荐使用字符串(如 'user')而非数字,避免类型转换陷阱。

  2. 动态渲染问题 :如果标签页内容是通过异步数据渲染的,切换标签时可能会出现"闪屏"或数据不同步。建议在子组件内使用 mountedactivated钩子处理数据获取。

  3. 样式覆盖 :Element UI 的标签页样式比较固定。如需深度定制(如修改下划线颜色),需要使用深度选择器(如 /deep/::v-deep),并注意样式隔离。

6. 官方文档地址

由于 Element UI 已归档,建议在维护老项目时参考以下文档:

特别提醒 :如果你正在开发新项目 ,请务必使用 **Element Plus (Vue 3)**​ 或其它现代 UI 库,Element UI 仅适合维护存量项目。

相关推荐
Larcher5 小时前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher5 小时前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
eric-sjq9 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
To_OC9 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
90后的晨仔10 小时前
Mac 开发 uni-app 终极方案:让安卓模拟器彻底脱离 Android Studio 独立运行
前端·vue.js
kyriewen10 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
一壶浊酒..11 小时前
Scrape Webpack练习
开发语言·javascript·webpack
默_笙14 小时前
⛵ 我用 React + TS 做了个"调色盘",顺便学会了企业级项目的目录架构
前端·javascript
渣波15 小时前
拒绝 Redux 样板代码:Zustand 核心原理与实战进阶指南(基础、异步与切片模式)
前端·javascript
C++、Java和Python的菜鸟15 小时前
第12章 前端Web进阶(Vue工程化+ElementPlus)
前端·javascript·vue.js