赋予应用专业外观:Element Plus 与 UI 组件库实战

在掌握了 Vue 3 的组件化开发,以及使用 Vue Router 和 Pinia 串联起单页应用(SPA)的逻辑后,我们已经具备了“把代码跑通”的能力。

但此时你可能会发现一个尴尬的事实:页面太丑了

原生 HTML 提供的 <button><input><table> 等元素在不同浏览器下的样式不一致,而且非常简陋。如果要手动用 CSS 把它们写成现代商业级项目的精美外观,不仅耗时耗力,还要处理各种交互细节(如按钮的点击波纹、弹窗的遮罩层、下拉框的定位等)。

为了解决这个问题,现代前端开发几乎都会引入现成的 UI 组件库。本篇我们将以 Vue 3 生态中最受欢迎的 Element Plus 为例,带你快速完成应用外观的“现代化升级”。

1. 什么是 UI 组件库?

UI 组件库(UI Library)是开发者将常用的界面元素(按钮、表单、表格、菜单、对话框等)使用特定框架(如 Vue/React)封装好的一套现成的、可复用的组件集合

1.1 为什么要使用组件库?

  1. 开箱即用,极高效率:别人花了几百小时打磨好的漂亮表格,你只需要写一行 <el-table> 就能拥有。
  2. 统一的设计规范:组件库由专业的设计团队(UED)出具规范,保证了整个项目的字体、间距、颜色高度一致。
  3. 完善的交互与边缘情况处理:比如一个简单的下拉菜单,组件库会帮你处理好“点击空白处收起”、“超出屏幕自动翻转”、“无障碍访问 (A11y)”等细节,这是自己手写极难考虑周全的。

1.2 Vue 3 常见组件库对比

在 Vue 3 生态中,目前最主流的 PC 端组件库有:

  • Element Plus:饿了么团队开源的 Element UI 的 Vue 3 版本。国内后台管理系统占有率极高,社区庞大,遇到问题极容易搜到解决方案。(本篇重点
  • Ant Design Vue:蚂蚁金服 Ant Design 的 Vue 实现。设计语言偏向金融和企业级,也非常受欢迎。
  • Naive UI:尤雨溪(Vue 作者)推荐过的组件库。全量使用 TypeScript 编写,主题定制极其灵活,近年来越来越火。

对于新手来说,选择 Element Plus 作为第一个组件库,能最大程度降低学习成本并匹配国内的就业需求。


2. 在项目中接入 Element Plus

2.1 安装

假设你已经有一个通过 Vite 创建的 Vue 3 项目,首先打开终端安装 Element Plus:

npm install element-plus

2.2 引入方式:为什么推荐“按需自动导入”?

使用 Element Plus 有两种主要方式:完整引入按需引入

完整引入虽然简单(在 main.js 里写三行代码),但会把整个组件库所有的代码和样式都打包进最终文件里,导致项目体积变得非常大。

现代前端工程极力推荐 按需自动导入。即:你在代码里用到什么组件(比如 <el-button>),构建工具就会自动帮你引入这个组件对应的 JS 和 CSS,你完全不需要手动写 import

配置自动导入的方法:

首先安装自动导入的插件:

npm install -D unplugin-vue-components unplugin-auto-import

然后,修改项目根目录下的 vite.config.js

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'

export default defineConfig({
  plugins: [
    vue(),
    // 配置自动导入 API
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    // 配置自动导入组件
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
})

配置完成后,重启开发服务器。现在你可以直接在任何 .vue 模板中使用 Element Plus 的组件了,无需任何额外的 import


3. 核心高频组件实战

Element Plus 提供了上百个组件,但实际开发中,有几类组件是“天天见”的。让我们结合之前学过的 Vue 知识来实战一下。

3.1 基础组件:Button(按钮)

按钮是交互的起点。Element Plus 提供了丰富的按钮类型和状态。

<template>
  <div>
    <!-- type 控制颜色主题 -->
    <el-button>默认按钮</el-button>
    <el-button type="primary">主要按钮</el-button>
    <el-button type="success">成功按钮</el-button>
    <el-button type="danger">危险按钮</el-button>
    
    <!-- 其他形态 -->
    <el-button plain>朴素按钮</el-button>
    <el-button round>圆角按钮</el-button>
    <el-button disabled>禁用状态</el-button>
    
    <!-- 配合 Vue 事件绑定 -->
    <el-button type="primary" :loading="isSubmitting" @click="handleSubmit">
      提交表单
    </el-button>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const isSubmitting = ref(false)
const handleSubmit = () => {
  isSubmitting.value = true
  setTimeout(() => isSubmitting.value = false, 2000)
}
</script>

3.2 表单组件:Form(极其重要)

在管理系统中,表单录入是核心需求。Element Plus 的 <el-form> 不仅美观,还内置了极其强大的表单校验功能。这比我们手写一堆 if/else 来判断用户输入要优雅得多。

<template>
  <!-- model 绑定表单数据对象,rules 绑定校验规则 -->
  <el-form :model="formData" :rules="formRules" ref="formRef" label-width="80px">
    
    <!-- prop 对应 rules 中的字段名,用于校验 -->
    <el-form-item label="用户名" prop="username">
      <el-input v-model="formData.username" placeholder="请输入用户名" />
    </el-form-item>

    <el-form-item label="密码" prop="password">
      <el-input v-model="formData.password" type="password" show-password />
    </el-form-item>

    <el-form-item>
      <el-button type="primary" @click="submitForm">立即登录</el-button>
    </el-form-item>
  </el-form>
</template>

<script setup>
import { reactive, ref } from 'vue'

// 获取表单组件的真实 DOM (Template Ref)
const formRef = ref(null)

// 表单响应式数据
const formData = reactive({
  username: '',
  password: ''
})

// 表单校验规则
const formRules = reactive({
  username: [
    { required: true, message: '用户名不能为空', trigger: 'blur' },
    { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
  ],
  password: [
    { required: true, message: '密码不能为空', trigger: 'blur' }
  ]
})

// 提交方法
const submitForm = () => {
  // 调用表单组件暴露的 validate 方法进行校验
  formRef.value.validate((valid) => {
    if (valid) {
      console.log('校验通过,准备发送请求:', formData)
    } else {
      console.log('表单校验失败!')
      return false
    }
  })
}
</script>

3.3 数据展示:Table(表格)

把后端请求回来的数组渲染成带分页、排序的表格,是前端的高频工作。Element Plus 把这个过程简化到了极致。

<template>
  <!-- :data 绑定数组数据 -->
  <el-table :data="tableData" border style="width: 100%">
    <!-- prop 对应数组对象中的字段,label 是表头 -->
    <el-table-column prop="date" label="日期" width="180" />
    <el-table-column prop="name" label="姓名" width="180" />
    <el-table-column prop="address" label="地址" />
    
    <!-- 自定义列:利用我们在 Vue 基础中学过的“插槽 (Slot)” -->
    <el-table-column label="操作">
      <template #default="scope">
        <!-- scope.row 可以拿到当前这一行的数据对象 -->
        <el-button size="small" type="primary" @click="handleEdit(scope.row)">编辑</el-button>
        <el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script setup>
import { ref } from 'vue'

// 模拟从后端请求回来的数据
const tableData = ref([
  { id: 1, date: '2026-06-01', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' },
  { id: 2, date: '2026-06-02', name: '张小刚', address: '北京市朝阳区大悦城' }
])

const handleEdit = (row) => {
  console.log('编辑用户:', row.name)
}
const handleDelete = (row) => {
  console.log('删除用户 ID:', row.id)
}
</script>

注意到了吗?上面代码中自定义操作列时,使用的正是 Vue 基础篇讲过的 <slot> 概念。组件库大量使用了插槽来保证灵活性。

3.4 反馈组件:Message 与 Dialog

1. 消息提示 (Message) 在调用接口成功或失败后,我们通常会在页面顶部弹出一个轻量级的提示。这不需要在模板里写 HTML,直接在 JS 里调用即可。

注意:因为 Message 是纯 JS API,自动导入配置可能无法完美推导,建议手动引入。

import { ElMessage } from 'element-plus'

const saveData = async () => {
  try {
    await api.save()
    ElMessage.success('保存成功!')
  } catch (error) {
    ElMessage.error('保存失败,请重试。')
  }
}

2. 对话框 (Dialog) 用于在不离开当前页面的情况下,弹出一个覆盖层处理任务(如:点击“新增”弹出的表单)。

<template>
  <el-button @click="dialogVisible = true">打开弹窗</el-button>

  <el-dialog v-model="dialogVisible" title="提示" width="30%">
    <!-- 默认插槽:弹窗主体内容 -->
    <span>这是一段信息,你可以把表单放进来。</span>
    
    <!-- 具名插槽:弹窗底部的按钮区 -->
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="dialogVisible = false">确定</el-button>
      </span>
    </template>
  </el-dialog>
</template>

<script setup>
import { ref } from 'vue'

// 控制弹窗显示与隐藏的响应式变量
const dialogVisible = ref(false)
</script>

4. 补充:图标的使用

现代 UI 界面离不开图标。Element Plus 提供了单独的 SVG 图标库。

首先安装图标库:

npm install @element-plus/icons-vue

然后在组件中使用(由于图标也是组件,需要导入):

<template>
  <div>
    <!-- 配合按钮使用 -->
    <el-button type="primary" :icon="Search">搜索</el-button>
    <el-button type="primary" :icon="Edit" circle />
    
    <!-- 单独使用图标组件 -->
    <el-icon color="#409EFC" size="20"><Setting /></el-icon>
  </div>
</template>

<script setup>
// 按需引入所需的图标组件
import { Search, Edit, Setting } from '@element-plus/icons-vue'
</script>

5. 总结

引入 UI 组件库,是前端开发效率的第一次巨大飞跃。通过本文,你应该体会到了:

  • 效率:不再需要手写繁琐的 CSS 和边缘逻辑。
  • 融合:组件库是对 Vue 基础知识(响应式数据、Props、事件、插槽、Template Refs)的最佳实战检验。当你能熟练阅读组件库文档并运用这些概念时,说明你的 Vue 基础已经非常扎实了。

至此,我们的单页应用前端技术栈拼图已经集齐:

  1. 结构与样式:HTML + CSS + JavaScript
  2. 构建与工程:Vite + Node.js/npm
  3. 框架与视图:Vue 3
  4. 路由与状态:Vue Router + Pinia
  5. UI 与交互:Element Plus

下一步建议: 技术栈准备就绪后,不要再停留在零散的 Demo 层面。强烈建议你开始从零搭建一个完整的“后台管理系统”。在真实项目中,去体验如何配置 Axios 请求拦截器、如何根据登录状态动态渲染左侧菜单、如何封装一个通用的表格组件。实战,永远是前端进阶的唯一捷径。