前端组件库——Element Plus知识点大全(二)

简介: 教程来源 https://yyvgt.cn/category/jiulishi.html Element Plus核心组件详解:涵盖按钮(6类语义化类型、多种样式变体及图标支持)、栅格与间距布局、表单(含验证规则)、表格(排序/分页/树形等)、数据录入(输入框、选择器、时间控件等)及反馈组件(消息/弹窗/通知),并支持SCSS变量覆盖与CSS变量双模式主题定制。

三、核心组件详解

3.1 按钮组件 Button
按钮是用户交互中最基础的组件,Element Plus的Button组件提供了丰富的样式和状态配置。

按钮类型
Element Plus定义了6种按钮类型,每种类型都有明确的语义:

<template>
  <div>
    <el-button>默认按钮</el-button>
    <el-button type="primary">主要按钮</el-button>
    <el-button type="success">成功按钮</el-button>
    <el-button type="info">信息按钮</el-button>
    <el-button type="warning">警告按钮</el-button>
    <el-button type="danger">危险按钮</el-button>
  </div>
</template>

按钮类型说明:primary用于主要操作(如提交、保存),success用于正向操作(如通过、发布),danger用于破坏性操作(如删除),warning用于需要谨慎的操作,info用于中性信息展示,默认按钮用于一般性操作(如取消、返回)。
image.png

<template>
  <div>
    <el-button size="large">大按钮</el-button>
    <el-button>默认按钮</el-button>
    <el-button size="small">小按钮</el-button>
  </div>
</template>

按钮样式变体
Element Plus提供了多种按钮样式变体,满足不同设计需求:

<template>
  <div>
    <!-- 朴素按钮(描边) -->
    <el-button type="primary" plain>朴素按钮</el-button>

    <!-- 圆角按钮 -->
    <el-button type="primary" round>圆角按钮</el-button>

    <!-- 圆形按钮(通常用于图标按钮) -->
    <el-button type="primary" circle>
      <el-icon><Search /></el-icon>
    </el-button>

    <!-- 文本按钮 -->
    <el-button type="primary" text>文本按钮</el-button>

    <!-- 链接按钮(2.2.1+版本) -->
    <el-button type="primary" link>链接按钮</el-button>

    <!-- 禁用按钮 -->
    <el-button type="primary" disabled>禁用按钮</el-button>

    <!-- 加载按钮 -->
    <el-button type="primary" loading>加载中</el-button>
  </div>
</template>

图标按钮
Element Plus支持在按钮中添加图标,可以提升操作的直观性:

<template>
  <div>
    <!-- 纯图标按钮 -->
    <el-button type="primary" :icon="Share" circle></el-button>

    <!-- 图标在前 -->
    <el-button type="primary" :icon="Search">搜索</el-button>

    <!-- 图标在后 -->
    <el-button type="primary">
      上传
      <el-icon class="el-icon--right"><Upload /></el-icon>
    </el-button>
  </div>
</template>

<script setup>
import { Share, Search, Upload } from '@element-plus/icons-vue'
</script>

按钮组

当多个操作相关联时,可以使用将它们组合在一起,消除重复边框:

<template>
  <el-button-group>
    <el-button type="primary">上一页</el-button>
    <el-button type="primary">下一页</el-button>
  </el-button-group>
</template>
#

3.2 布局组件
3.2.1 栅格系统 Grid
Element Plus的栅格系统基于24列设计,通过Row和Col组件组合实现响应式布局:

<template>
  <el-row :gutter="20">
    <!-- gutter设置列间距,单位px -->
    <el-col :span="12">
      <div class="grid-content">占12列</div>
    </el-col>
    <el-col :span="12">
      <div class="grid-content">占12列</div>
    </el-col>
  </el-row>

  <!-- 响应式布局 -->
  <el-row :gutter="20">
    <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4">
      <div class="grid-content">响应式列</div>
    </el-col>
  </el-row>

  <!-- 列偏移 -->
  <el-row>
    <el-col :span="6" :offset="6">
      <div class="grid-content">偏移6列</div>
    </el-col>
  </el-row>

  <!-- 列排序(push/pull) -->
  <el-row>
    <el-col :span="18" :push="6">
      <div class="grid-content">右侧内容</div>
    </el-col>
    <el-col :span="6" :pull="18">
      <div class="grid-content">左侧内容</div>
    </el-col>
  </el-row>
</el-row>

image.png
3.2.2 间距组件 Space

组件用于管理子元素之间的间距,是中后台布局中非常实用的辅助组件:

<template>
  <!-- 水平间距 -->
  <el-space>
    <el-button>按钮1</el-button>
    <el-button>按钮2</el-button>
    <el-button>按钮3</el-button>
  </el-space>

  <!-- 垂直间距 -->
  <el-space direction="vertical" :size="20">
    <el-card>卡片1</el-card>
    <el-card>卡片2</el-card>
  </el-space>

  <!-- 自定义间距 -->
  <el-space wrap :size="[10, 20]">
    <el-tag v-for="i in 10" :key="i">标签{
  { i }}</el-tag>
  </el-space>
</template>

3.3 表单组件 Form

表单是企业级应用中最核心的组件之一。Element Plus的表单组件提供了完善的验证机制和优雅的错误提示。

基础表单结构

<template>
  <el-form
    ref="formRef"
    :model="formData"
    :rules="formRules"
    label-width="100px"
    label-position="right"
    size="default"
  >
    <el-form-item label="用户名" prop="username">
      <el-input
        v-model="formData.username"
        placeholder="请输入用户名"
        clearable
      />
    </el-form-item>

    <el-form-item label="邮箱" prop="email">
      <el-input
        v-model="formData.email"
        placeholder="请输入邮箱"
        clearable
      />
    </el-form-item>

    <el-form-item label="角色" prop="role">
      <el-select v-model="formData.role" placeholder="请选择角色" clearable>
        <el-option label="管理员" value="admin" />
        <el-option label="普通用户" value="user" />
      </el-select>
    </el-form-item>

    <el-form-item label="状态" prop="status">
      <el-switch v-model="formData.status" active-text="启用" inactive-text="禁用" />
    </el-form-item>

    <el-form-item>
      <el-button type="primary" @click="handleSubmit">提交</el-button>
      <el-button @click="handleReset">重置</el-button>
    </el-form-item>
  </el-form>
</template>

<script setup>
import { ref, reactive } from 'vue'
import { ElMessage } from 'element-plus'

const formRef = ref()

const formData = reactive({
  username: '',
  email: '',
  role: '',
  status: false
})

// 表单验证规则
const formRules = {
  username: [
    { required: true, message: '请输入用户名', trigger: 'blur' },
    { min: 3, max: 20, message: '长度在3-20个字符', trigger: 'blur' }
  ],
  email: [
    { required: true, message: '请输入邮箱', trigger: 'blur' },
    { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }
  ],
  role: [
    { required: true, message: '请选择角色', trigger: 'change' }
  ]
}

const handleSubmit = () => {
  formRef.value?.validate((valid) => {
    if (valid) {
      ElMessage.success('提交成功')
      console.log('表单数据:', formData)
    } else {
      ElMessage.error('请正确填写表单')
    }
  })
}

const handleReset = () => {
  formRef.value?.resetFields()
}
</script>

表单验证规则详解
Element Plus的表单验证基于async-validator库,提供了丰富的内置验证规则和自定义验证能力:
image.png
自定义验证器示例:

const validatePass = (rule, value, callback) => {
  if (value === '') {
    callback(new Error('请输入密码'))
  } else if (value.length < 6) {
    callback(new Error('密码长度不能少于6位'))
  } else {
    callback()
  }
}

const formRules = {
  password: [
    { validator: validatePass, trigger: 'blur' }
  ]
}

3.4 表格组件 Table
表格是中后台系统中最复杂的组件之一,Element Plus的Table组件支持排序、筛选、分页、多选、自定义列、树形数据等丰富功能。

基础表格

<template>
  <el-table
    :data="tableData"
    stripe
    border
    style="width: 100%"
    :row-class-name="tableRowClassName"
  >
    <el-table-column type="selection" width="55" />
    <el-table-column prop="date" label="日期" width="180" sortable />
    <el-table-column prop="name" label="姓名" width="180" />
    <el-table-column prop="address" label="地址" min-width="200" show-overflow-tooltip />
    <el-table-column label="状态" width="100">
      <template #default="{ row }">
        <el-tag :type="row.status === 1 ? 'success' : 'danger'">
          {
  { row.status === 1 ? '启用' : '禁用' }}
        </el-tag>
      </template>
    </el-table-column>
    <el-table-column label="操作" width="150" fixed="right">
      <template #default="{ row }">
        <el-button link type="primary" @click="handleEdit(row)">编辑</el-button>
        <el-button link type="danger" @click="handleDelete(row)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>

  <!-- 分页 -->
  <el-pagination
    v-model:current-page="currentPage"
    v-model:page-size="pageSize"
    :total="total"
    :page-sizes="[10, 20, 50, 100]"
    layout="total, sizes, prev, pager, next, jumper"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
  />
</template>

<script setup>
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'

const tableData = ref([])
const currentPage = ref(1)
const pageSize = ref(20)
const total = ref(0)

const handleEdit = (row) => {
  console.log('编辑', row)
}

const handleDelete = (row) => {
  ElMessageBox.confirm('确定删除吗?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    ElMessage.success('删除成功')
  })
}
</script>

3.5 数据录入组件
Element Plus提供了完整的数据录入组件体系:

<template>
  <div>
    <!-- 输入框 -->
    <el-input v-model="inputValue" placeholder="请输入" clearable />

    <!-- 带前后缀的输入框 -->
    <el-input v-model="searchValue" placeholder="请输入">
      <template #prefix>
        <el-icon><Search /></el-icon>
      </template>
    </el-input>

    <!-- 文本域 -->
    <el-input v-model="textareaValue" type="textarea" :rows="4" />

    <!-- 数字输入框 -->
    <el-input-number v-model="numValue" :min="1" :max="100" />

    <!-- 下拉选择 -->
    <el-select v-model="selectValue" placeholder="请选择" clearable filterable>
      <el-option label="选项一" value="1" />
      <el-option label="选项二" value="2" />
    </el-select>

    <!-- 级联选择 -->
    <el-cascader v-model="cascaderValue" :options="options" />

    <!-- 日期时间选择 -->
    <el-date-picker v-model="dateValue" type="datetime" placeholder="选择日期时间" />

    <!-- 日期范围选择 -->
    <el-date-picker
      v-model="dateRange"
      type="daterange"
      range-separator="至"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
    />

    <!-- 单选框 -->
    <el-radio-group v-model="radioValue">
      <el-radio label="1">选项一</el-radio>
      <el-radio label="2">选项二</el-radio>
    </el-radio-group>

    <!-- 多选框 -->
    <el-checkbox-group v-model="checkboxValue">
      <el-checkbox label="1">选项一</el-checkbox>
      <el-checkbox label="2">选项二</el-checkbox>
    </el-checkbox-group>

    <!-- 开关 -->
    <el-switch v-model="switchValue" />

    <!-- 滑块 -->
    <el-slider v-model="sliderValue" :min="0" :max="100" />
  </div>
</template>

3.6 反馈组件
消息提示 Message

<script setup>
import { ElMessage } from 'element-plus'

const showMessage = () => {
  ElMessage.success('操作成功')
  ElMessage.warning('警告信息')
  ElMessage.error('错误信息')
  ElMessage.info('提示信息')

  // 自定义配置
  ElMessage({
    message: '自定义消息',
    type: 'success',
    duration: 3000,
    showClose: true
  })
}
</script>

确认弹窗 MessageBox

<script setup>
import { ElMessageBox, ElMessage } from 'element-plus'

const confirmDelete = () => {
  ElMessageBox.confirm('确定删除这条数据吗?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    ElMessage.success('删除成功')
  }).catch(() => {
    ElMessage.info('已取消删除')
  })
}
</script>

通知 Notification

<script setup>
import { ElNotification } from 'element-plus'

const showNotification = () => {
  ElNotification.success({
    title: '成功',
    message: '操作成功完成',
    duration: 3000,
    position: 'top-right'
  })
}
</script>

四、主题定制

Element Plus提供了灵活的主题定制能力,支持通过SCSS变量覆盖或CSS变量两种方式。
https://yyvgt.cn/category/jiujieshao.html
4.1 基础原理
Element Plus的样式系统基于SCSS编写,其主题相关的颜色、尺寸、间距等都定义为SCSS变量(变量名通常以$--el-开头)。主题定制的原理就是利用Sass的变量覆盖特性——在导入Element Plus的SCSS源文件之前,先定义自定义的变量值,Sass编译器在处理时就会使用新值替换默认值。

4.2 SCSS变量覆盖方式
方式一:在Vite项目中定制主题
步骤1:创建自定义主题文件

// src/styles/element/index.scss
// 覆盖Element Plus的SCSS变量

// 主题主色(例如设置为紫色)
$--el-color-primary: #7c3aed;
$--el-color-primary-light-3: #a78bfa;
$--el-color-primary-light-5: #c4b5fd;
$--el-color-primary-light-7: #ddd6fe;
$--el-color-primary-light-8: #ede9fe;
$--el-color-primary-light-9: #f5f3ff;
$--el-color-primary-dark-2: #6d28d9;

// 功能色
$--el-color-success: #10b981;
$--el-color-warning: #f59e0b;
$--el-color-danger: #ef4444;
$--el-color-info: #6b7280;

// 圆角
$--el-border-radius-base: 8px;

// 导入Element Plus的SCSS源文件
@use "element-plus/theme-chalk/src/index.scss" as *;

步骤2:安装sass依赖

npm install -D sass

步骤3:在main.js中导入自定义主题

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'

// 导入自定义主题文件(必须在Element Plus样式之前)
import './styles/element/index.scss'

const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

步骤4:Vite配置(按需引入时)

如果使用按需引入,需要在vite.config.ts中进行额外配置:

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import ElementPlus from 'unplugin-element-plus/vite'

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver({ importStyle: 'sass' })],
    }),
    ElementPlus({ useSource: true }),  // 使用SCSS源文件
  ],
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@use "@/styles/element/index.scss" as *;`,
      },
    },
  },
})

4.3 CSS变量方式
Element Plus也支持通过CSS变量进行运行时主题切换:

<template>
  <el-config-provider :locale="locale">
    <app />
  </el-config-provider>
</template>

<script setup>
import { ElConfigProvider } from 'element-plus'

// 动态修改CSS变量
const setTheme = (color) => {
  document.documentElement.style.setProperty('--el-color-primary', color)
}
</script>

4.4 常用可覆盖变量
image.png
来源:
https://yyvgt.cn/

相关文章
|
2月前
|
自然语言处理 前端开发 JavaScript
前端组件库——Element Plus知识点大全(三)
教程来源 https://yyvgt.cn/category/jiushige.html 本文详解Element Plus性能优化与国际化实践:通过按需引入(体积降60%+)、代码分割、骨架屏、组件懒加载四大策略显著提升首屏速度;并借助el-config-provider轻松实现中英文等多语言切换,助力构建高性能、国际化的企业级Vue 3应用。
|
2月前
|
JavaScript 前端开发 API
前端组件库——Element Plus知识点大全(一)
教程来源 https://tmywi.cn/category/lvxing.html Element Plus是饿了么团队打造的Vue 3官方UI库,深度集成TypeScript与Composition API,提供70+企业级组件、完善设计规范及主题定制能力。GitHub星标超2.5万,国内Vue 3中后台开发首选方案。
|
存储 Kubernetes NoSQL
无锁队列实现及使用场景
无锁队列实现及使用场景
|
8天前
|
人工智能 自然语言处理 API
阿里云百炼大模型服务平台主要模型介绍:文本生成、图像与视频、音频与语音等热门模型与能力简介
阿里云百炼是阿里云推出的一站式大模型开发与应用平台,集成千问(Qwen)全系列及DeepSeek、Kimi、GLM、MiniMax等主流第三方大模型,覆盖文本、图像、音频、视频、向量等多模态能力。开发者可通过OpenAI兼容API直接调用模型,业务人员则可借助可视化工具快速搭建智能体、知识库问答等AI应用,无需自行部署运维。新用户注册开通即可获赠超7000万tokens免费额度,支持从模型体验到应用落地的流程服务,显著降低AI应用开发门槛。
|
8天前
|
缓存 安全 Windows
C 盘垃圾清理全攻略:先删什么、哪些该迁移,安全扩容不翻车
本文手把手教你一套安全、高效、不踩坑的 C 盘清理流程,配图清晰,照着做就能释放大量空间!
|
1月前
|
安全 网络安全 UED
破解可信平台钓鱼新攻击:邮件端远程浏览隔离利器,阻断定向协作通知攻击
近期,攻击者利用SharePoint等可信平台发起定向钓鱼,发送约4万封伪装成协作通知的恶意邮件,绕过传统网关白名单检测。方向标推出邮件端远程浏览器隔离系统,通过“流量全隔离+远端执行+行为限控”,实现点击风险彻底隔离,保障用户体验与合规审计。(239字)
76 7
|
2月前
|
机器学习/深度学习 数据采集 算法
6类钢材表面缺陷检测数据集(6000张)|YOLO训练数据集 工业质检 缺陷识别 智能制造 表面检测
本数据集含6000张真实工业场景钢材表面图像,精准标注6类典型缺陷(裂纹、夹杂、斑块、麻面、氧化皮压入、划痕),采用YOLO标准格式,结构规范、质量高,可直接用于YOLOv5/v8等模型训练,助力工业质检智能化升级。
|
2月前
|
JSON 小程序 前端开发
前端组件库——Vant Weapp知识点大全
教程来源 http://oplhc.cn/ Vant Weapp是有赞官方打造的高星(1.1w+)微信小程序UI组件库,轻量、稳定、高性能,含50+组件与CSS变量主题系统,支持按需引入与深度定制,是小程序开发首选开源UI方案。
|
2月前
|
存储 分布式计算 运维
迅雷基于阿里云 EMR Serverless Spark 实现数仓资源效率与业务提升
迅雷基于阿里云 EMR Serverless Spark 实现数仓资源效率与业务提升,在迁移到 EMR Serverless Spark 之后,TCO 明显下降,平台按作业生命周期弹性拉起与回收,只为实际消耗付费;同时,托管化带来了稳定性与调度效率提升;更关键的是交付确定性提升,大作业整体可提速约 1 小时,报表链路从长尾波动变成更可控的出数节奏。
|
6月前
|
机器学习/深度学习 人工智能 运维
别只盯着 CPU 爆了!一篇文章带你看懂:从指标到根因的 AIOps 自动化故障定位流水线
别只盯着 CPU 爆了!一篇文章带你看懂:从指标到根因的 AIOps 自动化故障定位流水线
819 15

热门文章

最新文章