Element UI 与 Ant Design 速查

用现成的组件库,像搭积木一样快速搭建后台管理界面 — 给中际旭创数据可视化工程师的前端实战手册

01 · 组件库是什么

IKEA 宜家的比方

想象你要装修新家:

  • 不用组件库(自己打家具):自己去山里砍树 → 锯木板 → 雕花 → 上漆 → 组装。一个椅子搞两周,做出来还可能三条腿不平
  • 用组件库(宜家家居):去宜家挑选成品 → 看说明书组装 → 搞定。一个下午全屋家具到位,风格统一、质量有保证

组件库 = 宜家家具:按钮、表格、对话框、导航栏……全是现成的,拿来即用,风格统一。

为什么要用组件库?

三大理由
理由说明类比
省时间 一个漂亮的带分页的数据表格,自己写要 3 天,用组件库 10 分钟 宜家买书架 vs 自己从木头开始做
风格统一 所有按钮、输入框、卡片风格一致,不会出现一个圆角一个尖角的尴尬 宜家一整套家具风格统一
内置无障碍 键盘导航、ARIA 标签、屏幕阅读器支持,不用自己操心 宜家的家具自带安全认证

主流组件库一览

组件库框架特点谁在用
Element PlusVue 3国内最流行的 Vue 组件库,中文文档最全国内大部分企业后台
Ant DesignReact阿里出品,设计规范最完善,ProComponents 超强阿里系、海外团队
Ant Design VueVue 3Ant Design 的 Vue 版本喜欢 Ant 风格的 Vue 项目
Naive UIVue 3尤雨溪推荐,Tree-shaking 友好新项目、追求体积小
Arco DesignReact / Vue字节跳动出品,设计精美字节系产品
岗位要求解读

招聘要求写的"熟悉 Element UI / Ant Design 等组件库,能快速搭建后台管理界面",翻译成白话就是:
"给你一个需求文档,你能用 Element 或 Ant Design 在 1-2 天内搭出一个完整的后台页面"

02 · Element Plus 安装与配置

Element Plus 是 Element UI 的 Vue 3 版本。如果你的项目用 Vue 3,就用它。

安装

Bash — 安装 Element Plus
# 用 npm 安装
npm install element-plus

# 用 pnpm 安装(推荐,更快)
pnpm add element-plus

方式一:完整引入(最简单)

main.ts — 完整引入
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'

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

所有 Element Plus 组件全局注册,直接在模板中使用 <el-button><el-table> 等,无需单独引入。

方式二:按需引入(推荐,打包更小)

Bash — 安装自动导入插件
pnpm add -D unplugin-vue-components unplugin-auto-import
vite.config.ts — 配置自动导入
import { defineConfig } from 'vite'
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: [
    AutoImport({ resolvers: [ElementPlusResolver()] }),
    Components({ resolvers: [ElementPlusResolver()] }),
  ],
})
初学者建议

先用完整引入,简单省事。等项目做大了再换成按需引入优化体积。不要在"怎么引入"上纠结太久。

03 · Element Plus 常用组件速查

这是你在工作中每天都会用到的组件。每个组件都有代码示例和效果描述。

el-button — 按钮

最基础的组件,几乎所有页面都会用到。

Vue Template — 按钮类型
<el-button type="primary">主要按钮</el-button>
<el-button type="success">成功按钮</el-button>
<el-button type="warning">警告按钮</el-button>
<el-button type="danger">危险按钮</el-button>
<el-button>默认按钮</el-button>

<!-- 带图标的按钮 -->
<el-button type="primary" :icon="Search">搜索</el-button>
<el-button type="primary" :icon="Plus">新增</el-button>
渲染效果

主要按钮 成功按钮 警告按钮 危险按钮 默认按钮

el-input — 输入框

Vue Template — 输入框用法
<!-- 基础输入框 -->
<el-input v-model="form.name" placeholder="请输入设备名称" />

<!-- 带搜索图标的输入框 -->
<el-input v-model="search" placeholder="搜索..." :prefix-icon="Search" />

<!-- 可清空的输入框 -->
<el-input v-model="keyword" clearable />

<!-- 文本域 -->
<el-input v-model="remark" type="textarea" :rows="3" />
渲染效果

请输入设备名称

🔍 搜索... 关键词 ×

el-select — 下拉选择

Vue Template + Script — 下拉选择
<el-select v-model="form.status" placeholder="请选择状态">
  <el-option label="运行中" value="running" />
  <el-option label="停机" value="stopped" />
  <el-option label="维修中" value="maintenance" />
</el-select>
渲染效果

点击后出现下拉框,显示三个选项:运行中、停机、维修中。选中后输入框显示对应文本。

el-date-picker — 日期选择器

Vue Template — 日期选择器
<!-- 选择日期 -->
<el-date-picker
  v-model="form.date"
  type="date"
  placeholder="选择日期"
/>

<!-- 选择日期范围(常用:查询某段时间的数据) -->
<el-date-picker
  v-model="dateRange"
  type="daterange"
  range-separator="至"
  start-placeholder="开始日期"
  end-placeholder="结束日期"
/>
渲染效果

日期范围选择器:2026-06-012026-06-10 — 点击后弹出日历面板,方便选择时间范围查询数据。

el-table — 数据表格(重点!)

为什么表格组件最重要?

在制造业后台系统中,80% 的页面都是表格——设备列表、生产记录、质检报告、库存清单……
掌握 el-table,你就掌握了后台管理界面的核心。

Vue Template — 数据表格
<el-table :data="tableData" stripe border>
  <el-table-column prop="id" label="设备ID" width="80" />
  <el-table-column prop="name" label="设备名称" />
  <el-table-column prop="status" label="状态" width="100">
    <!-- 自定义列内容:用 el-tag 显示状态 -->
    <template #default="{ row }">
      <el-tag :type="row.status === '运行中' ? 'success' : 'danger'">
        {{ row.status }}
      </el-tag>
    </template>
  </el-table-column>
  <el-table-column label="操作" width="180">
    <template #default="{ row }">
      <el-button size="small" type="primary">编辑</el-button>
      <el-button size="small" type="danger">删除</el-button>
    </template>
  </el-table-column>
</el-table>
渲染效果
设备ID设备名称状态操作
001激光切割机 A1运行中编辑 删除
002CNC加工中心 B3停机编辑 删除
003焊接机器人 C2运行中编辑 删除

el-form — 表单验证

Vue Template — 表单 + 验证规则
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
  <el-form-item label="设备名称" prop="name">
    <el-input v-model="form.name" />
  </el-form-item>
  <el-form-item label="设备类型" prop="type">
    <el-select v-model="form.type">
      <el-option label="激光切割机" value="laser" />
      <el-option label="CNC" value="cnc" />
    </el-select>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm">提交</el-button>
  </el-form-item>
</el-form>
Script — 验证规则
const rules = {
  name: [
    { required: true, message: '请输入设备名称', trigger: 'blur' },
    { min: 2, max: 20, message: '长度 2 到 20 个字符', trigger: 'blur' }
  ],
  type: [
    { required: true, message: '请选择设备类型', trigger: 'change' }
  ]
}

const submitForm = async () => {
  const valid = await formRef.value.validate()
  if (valid) {
    console.log('提交成功', form)
  }
}
渲染效果

左侧有 "设备名称"、"设备类型" 标签。点击提交时,如果必填项为空,输入框变红,下方显示红色提示文字 "请输入设备名称"。

el-dialog — 对话框/弹窗

Vue Template — 对话框
<!-- 触发按钮 -->
<el-button type="primary" @click="dialogVisible = true">
  新增设备
</el-button>

<!-- 弹窗 -->
<el-dialog v-model="dialogVisible" title="新增设备" width="500px">
  <el-form :model="form">
    <!-- 表单内容 -->
  </el-form>
  <template #footer>
    <el-button @click="dialogVisible = false">取消</el-button>
    <el-button type="primary">确定</el-button>
  </template>
</el-dialog>
渲染效果

点击按钮后,页面中央弹出一个带遮罩层的对话框,标题 "新增设备",底部有 "取消" 和 "确定" 两个按钮。点遮罩或取消按钮关闭弹窗。

el-card / el-tag / el-badge — 卡片 / 标签 / 徽章

Vue Template — 卡片 + 标签 + 徽章
<!-- 卡片 -->
<el-card shadow="hover">
  <template #header>设备概况</template>
  <p>当前在线设备:42 台</p>
</el-card>

<!-- 标签 -->
<el-tag>默认</el-tag>
<el-tag type="success">运行中</el-tag>
<el-tag type="danger">故障</el-tag>
<el-tag type="warning">维修中</el-tag>

<!-- 徽章(数字角标) -->
<el-badge :value="12">
  <el-button>待处理工单</el-button>
</el-badge>
渲染效果

默认 运行中 故障 维修中   |   待处理工单 12

el-menu — 侧边导航栏

Vue Template — 侧边导航
<el-menu
  default-active="1"
  background-color="#304156"
  text-color="#bfcbd9"
  active-text-color="#a9e3ff"
>
  <el-menu-item index="1">首页</el-menu-item>
  <el-sub-menu index="2">
    <template #title>设备管理</template>
    <el-menu-item index="2-1">设备列表</el-menu-item>
    <el-menu-item index="2-2">设备维保</el-menu-item>
  </el-sub-menu>
  <el-menu-item index="3">生产数据</el-menu-item>
</el-menu>
渲染效果

深色背景的侧边导航栏,"首页"高亮为蓝色。"设备管理"可展开,展开后显示子菜单 "设备列表" 和 "设备维保"。

el-pagination — 分页

Vue Template — 分页组件
<el-pagination
  v-model:current-page="page"
  v-model:page-size="pageSize"
  :page-sizes="[10, 20, 50, 100]"
  :total="total"
  layout="total, sizes, prev, pager, next, jumper"
  @size-change="fetchData"
  @current-change="fetchData"
/>
渲染效果

底部显示:共 256 条 | 10 条/页 ▼ | < 1 2 3 ... 26 > | 前往 ___ 页
切换页码或每页条数时自动触发 fetchData 重新请求后端数据。

el-table + el-pagination 是黄金搭档

后台管理页面的标准组合:el-table 显示数据 + el-pagination 翻页
翻页时通过接口请求后端数据(后端分页),而不是一次性加载所有数据到前端。

04 · Dashboard 布局示例

后台管理系统的经典布局:左侧导航 + 右侧内容区域。Element 提供了 el-container 系列组件来实现。

Vue Template — 经典后台布局
<el-container style="height: 100vh">
  <!-- 左侧导航 -->
  <el-aside width="220px">
    <div class="logo">智能制造管理系统</div>
    <el-menu default-active="1" router>
      <el-menu-item index="/">首页</el-menu-item>
      <el-menu-item index="/devices">设备管理</el-menu-item>
      <el-menu-item index="/production">生产数据</el-menu-item>
      <el-menu-item index="/quality">质量检测</el-menu-item>
    </el-menu>
  </el-aside>

  <!-- 右侧区域 -->
  <el-container>
    <!-- 顶部导航栏 -->
    <el-header>
      <span>欢迎回来,张工</span>
    </el-header>
    <!-- 主内容区 -->
    <el-main>
      <!-- router-view 显示子路由页面 -->
      <router-view />
    </el-main>
  </el-container>
</el-container>
渲染效果
欢迎回来,张工
主内容区域(router-view)

05 · Ant Design 安装与配置

Ant Design 是蚂蚁集团出品的 React 组件库,是中国使用率最高的 React 组件库

安装

Bash — 安装 Ant Design
# 安装 antd (Ant Design 5.x)
npm install antd

# 安装图标库
npm install @ant-design/icons

使用(无需配置,开箱即用)

App.jsx — 直接使用
import { Button, Space } from 'antd'

function App() {
  return (
    <Space>
      <Button type="primary">主要按钮</Button>
      <Button>默认按钮</Button>
    </Space>
  )
}
说明

Ant Design 5.x 使用 CSS-in-JS,不需要手动引入 CSS 文件。组件会自动注入样式。这是和 Element Plus 最大的区别之一。

06 · Ant Design 常用组件速查

和 Element Plus 一一对应的组件,但用 React 的 JSX 语法。

Button — 按钮

React JSX — 按钮
import { Button, Space } from 'antd'
import { SearchOutlined, PlusOutlined } from '@ant-design/icons'

<Space>
  <Button type="primary">主要按钮</Button>
  <Button type="primary" danger>危险按钮</Button>
  <Button type="primary" icon={<PlusOutlined />}>新增</Button>
  <Button type="primary" icon={<SearchOutlined />}>搜索</Button>
</Space>
渲染效果

主要按钮 危险按钮 + 新增 🔍 搜索

和 Element 的区别:图标用 <PlusOutlined /> 组件而不是字符串属性,因为 React 更喜欢用组件来表达一切。

Input — 输入框

React JSX — 输入框
import { Input } from 'antd'

// 基础输入框
<Input placeholder="请输入设备名称" />

// 带前缀图标的搜索框
<Input.Search placeholder="搜索设备..." onSearch={handleSearch} />

// 密码输入框
<Input.Password placeholder="请输入密码" />

// 文本域
<Input.TextArea rows={3} />
Ant Design 的点语法组件

Ant Design 经常用 Input.SearchInput.PasswordInput.TextArea 这种"点语法"来组织子组件。
这是 React 的常见模式,不是什么高级语法,就是把 Search 等挂在 Input 对象上。

Select — 下拉选择

React JSX — 下拉选择
import { Select } from 'antd'

<Select
  style={{ width: 200 }}
  placeholder="选择状态"
  options={[
    { value: 'running', label: '运行中' },
    { value: 'stopped', label: '停机' },
    { value: 'maintenance', label: '维修中' },
  ]}
/>
和 Element 的区别

Element 用 <el-option> 子组件,Ant Design 用 options 属性传数组。Ant Design 的写法更简洁,数据驱动。

DatePicker — 日期选择器

React JSX — 日期选择器
import { DatePicker, Space } from 'antd'
const { RangePicker } = DatePicker

// 选择单个日期
<DatePicker />

// 选择日期范围
<RangePicker />

Table — 数据表格(重点!)

React JSX — 数据表格
import { Table, Tag, Button, Space } from 'antd'

const columns = [
  { title: '设备ID', dataIndex: 'id', key: 'id', width: 80 },
  { title: '设备名称', dataIndex: 'name', key: 'name' },
  {
    title: '状态', dataIndex: 'status', key: 'status',
    render: (status) => (
      <Tag color={status === '运行中' ? 'green' : 'red'}>{status}</Tag>
    )
  },
  {
    title: '操作', key: 'action',
    render: (_, record) => (
      <Space>
        <Button type="link">编辑</Button>
        <Button type="link" danger>删除</Button>
      </Space>
    )
  },
]

<Table
  columns={columns}
  dataSource={data}
  pagination={{ pageSize: 10, total: 256 }}
  rowKey="id"
/>
Ant Design vs Element 表格对比
对比项Element PlusAnt Design
列定义方式<el-table-column> 模板标签columns 配置数组
自定义列#default="{ row }" 插槽render 函数
分页单独的 <el-pagination>内置 pagination 属性
适用场景模板写法,直观配置写法,灵活

Form — 表单验证

React JSX — 表单
import { Form, Input, Select, Button } from 'antd'

const DeviceForm = () => {
  const [form] = Form.useForm()

  const onFinish = (values) => {
    console.log('提交:', values)
  }

  return (
    <Form form={form} onFinish={onFinish} layout="vertical">
      <Form.Item
        label="设备名称"
        name="name"
        rules={[{ required: true, message: '请输入设备名称' }]}
      >
        <Input />
      </Form.Item>
      <Form.Item
        label="设备类型"
        name="type"
        rules={[{ required: true, message: '请选择设备类型' }]}
      >
        <Select options={[...]} />
      </Form.Item>
      <Form.Item>
        <Button type="primary" htmlType="submit">提交</Button>
      </Form.Item>
    </Form>
  )
}
和 Element 的区别

Ant Design 用 Form.useForm() hook 管理表单状态,验证规则直接写在 rules 属性里。
不需要手动调用 validate(),点击提交按钮自动验证。

Modal — 对话框/弹窗

React JSX — 对话框
import { Modal, Button } from 'antd'

<Button type="primary" onClick={() => setOpen(true)}>
  新增设备
</Button>

<Modal
  title="新增设备"
  open={open}
  onOk={handleOk}
  onCancel={() => setOpen(false)}
>
  {/* 表单内容 */}
</Modal>

Menu — 侧边导航

React JSX — 侧边导航
import { Menu } from 'antd'
import { HomeOutlined, DesktopOutlined } from '@ant-design/icons'

<Menu
  theme="dark"
  mode="inline"
  defaultSelectedKeys={['1']}
  items={[
    { key: '1', icon: <HomeOutlined />, label: '首页' },
    { key: '2', icon: <DesktopOutlined />, label: '设备管理' },
  ]}
/>

07 · ProComponents — 后台开发神器

ProComponents = 全装修的房子

如果组件库是宜家的家具,那 ProComponents 就是全装修的房子——不仅家具给你配好了,连壁纸、灯具、窗帘都帮你装好了。
ProTable = 带搜索、筛选、分页、导出的超级表格,一行配置搞定一个完整的数据管理页面。

ProTable — 超级表格

React JSX — ProTable 一个组件搞定一整页
import ProTable from '@ant-design/pro-table'

<ProTable
  columns={columns}
  request={async (params) =>} {
    const res = await fetchDeviceList(params)
    return { data: res.list, total: res.total, success: true }
  }}
  search={{
    filterType: 'light',   // 轻量筛选栏
  }}
  toolBarRender={() => [
    <Button type="primary">新增设备</Button>,
  ]}
  pagination={{ pageSize: 10 }}
  rowKey="id"
/>
ProTable 自带的功能(不用你写!)
  • 搜索栏:根据 columns 自动生成搜索表单
  • 分页:自动翻页,自动带参数请求接口
  • 工具栏:新增按钮、刷新按钮、密度切换、列设置
  • 加载状态:请求中自动显示 Loading
  • 空状态:没数据时显示"暂无数据"

ProForm — 超级表单

React JSX — ProForm
import { ProFormText, ProFormSelect, ProFormDateTimePicker } from '@ant-design/pro-form'

<ProForm onFinish={async (values) =>} {
  await createDevice(values)
  message.success('提交成功')
}>
  <ProFormText
    name="name"
    label="设备名称"
    rules={[{ required: true }]}
  />
  <ProFormSelect
    name="type"
    label="设备类型"
    options={deviceTypes}
  />
  <ProFormDateTimePicker
    name="installDate"
    label="安装日期"
  />
</ProForm>
什么时候用 ProComponents?

如果你用 React + Ant Design 搭建后台管理系统,强烈推荐 ProComponents。它能把 2 天的工作量压缩到 2 小时。
但如果你是初学者,建议先用原生 Ant Design 组件打基础,理解原理后再用 Pro。

08 · 后台管理界面实战 — 制造业数据管理页

这就是"快速搭建后台管理界面"的意思

招聘要求说"能快速搭建后台管理界面",白话就是:给你一个 Excel 表(比如设备清单),你能用组件库在半天内搭出一个带搜索、分页、增删改查的网页

下面就是一个完整示例,涵盖后台页面最常见的所有功能。

完整示例:设备管理页面(Vue 3 + Element Plus)

DeviceManagement.vue — 完整页面
<template>
  <div class="device-page">

    <!-- 搜索栏 -->
    <el-card class="search-card">
      <el-form :inline="true" :model="searchForm">
        <el-form-item label="设备名称">
          <el-input v-model="searchForm.name" placeholder="请输入" />
        </el-form-item>
        <el-form-item label="状态">
          <el-select v-model="searchForm.status" clearable>
            <el-option label="运行中" value="running" />
            <el-option label="停机" value="stopped" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="fetchData">查询</el-button>
          <el-button @click="resetSearch">重置</el-button>
        </el-form-item>
      </el-form>
    </el-card>

    <!-- 数据表格 -->
    <el-card>
      <template #header>
        <div style="display:flex;justify-content:space-between">
          <span>设备列表</span>
          <el-button type="primary" @click="openDialog()">新增设备</el-button>
        </div>
      </template>

      <el-table :data="tableData" v-loading="loading" stripe>
        <el-table-column prop="id" label="ID" width="60" />
        <el-table-column prop="name" label="设备名称" />
        <el-table-column prop="type" label="设备类型" />
        <el-table-column prop="location" label="车间位置" />
        <el-table-column prop="status" label="状态" width="100">
          <template #default="{ row }">
            <el-tag :type="statusMap[row.status]">{{ row.status }}</el-tag>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="160">
          <template #default="{ row }">
            <el-button size="small" @click="openDialog(row)">编辑</el-button>
            <el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>

      <el-pagination
        style="margin-top:16px;justify-content:flex-end"
        v-model:current-page="page"
        v-model:page-size="pageSize"
        :total="total"
        layout="total, sizes, prev, pager, next"
        @current-change="fetchData"
      />
    </el-card>

    <!-- 新增/编辑弹窗 -->
    <el-dialog v-model="dialogVisible" :title="isEdit ? '编辑设备' : '新增设备'">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
        <el-form-item label="设备名称" prop="name">
          <el-input v-model="form.name" />
        </el-form-item>
        <el-form-item label="设备类型" prop="type">
          <el-select v-model="form.type">
            <el-option label="激光切割机" value="laser" />
            <el-option label="CNC加工中心" value="cnc" />
            <el-option label="焊接机器人" value="welding" />
          </el-select>
        </el-form-item>
        <el-form-item label="车间位置" prop="location">
          <el-input v-model="form.location" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>

  </div>
</template>

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

// 状态定义
const tableData = ref([])
const loading = ref(false)
const page = ref(1)
const pageSize = ref(10)
const total = ref(0)
const dialogVisible = ref(false)
const isEdit = ref(false)
const formRef = ref()

const searchForm = ref({ name: '', status: '' })
const form = ref({ name: '', type: '', location: '' })

const statusMap = {
  '运行中': 'success',
  '停机': 'danger',
  '维修中': 'warning',
}

// 获取数据
const fetchData = async () => {
  loading.value = true
  try {
    const res = await api.getDeviceList({
      page: page.value,
      pageSize: pageSize.value,
      ...searchForm.value
    })
    tableData.value = res.data.list
    total.value = res.data.total
  } finally {
    loading.value = false
  }
}

// 打开弹窗(新增 or 编辑)
const openDialog = (row = null) => {
  isEdit.value = !!row
  if (row) form.value = { ...row }
  else form.value = { name: '', type: '', location: '' }
  dialogVisible.value = true
}

// 提交表单
const handleSubmit = async () => {
  await formRef.value.validate()
  if (isEdit.value) {
    await api.updateDevice(form.value)
    ElMessage.success('编辑成功')
  } else {
    await api.createDevice(form.value)
    ElMessage.success('新增成功')
  }
  dialogVisible.value = false
  fetchData()
}

// 删除
const handleDelete = (row) => {
  ElMessageBox.confirm('确定删除该设备?', '警告', {
    type: 'warning',
  }).then(async () => {
    await api.deleteDevice(row.id)
    ElMessage.success('删除成功')
    fetchData()
  })
}

onMounted(() => fetchData())
</script>
这个页面包含了什么?
设备名称: 请输入 状态: 请选择 ▼ 查询 重置
设备列表 + 新增设备
ID设备名称类型位置状态操作
1激光切割机 A1激光A车间运行中编辑 删除
2CNC B3CNCB车间停机编辑 删除
共 42 条 < 1 2 3 4 5 >

页面功能清单

功能用的组件说明
搜索筛选el-form + el-input + el-select按设备名称、状态搜索
数据展示el-table条纹表格,加载动画
状态标签el-tag绿色=运行中,红色=停机
分页翻页el-pagination切换页码自动请求后端
新增/编辑el-dialog + el-form弹窗表单,带验证
删除确认ElMessageBox.confirm二次确认防误删
操作反馈ElMessage.success成功/失败提示
这段代码值多少钱?

这就是一个标准的后台 CRUD 页面(Create/Read/Update/Delete)。如果你能独立写出这样的页面,就已经具备了"快速搭建后台管理界面"的能力。
后台管理系统 90% 的页面都是这个模式,只是数据字段不同。

09 · Element vs Ant Design 对比

全方位对比
对比维度Element Plus (Vue 3)Ant Design (React)
所属框架 Vue 3 React
出品方 饿了么(前)→ 社区维护 蚂蚁集团(阿里)
国内市场 Vue 项目中最常用 React 项目中最常用
设计风格 简洁实用,偏后台风 精致规范,Ant Design 设计体系
样式方案 Sass/CSS(需手动引入 CSS) CSS-in-JS(无需引入 CSS 文件)
高级组件 基础组件齐全 ProComponents(超级表格/表单/布局)
自定义主题 CSS 变量覆盖 ConfigProvider + Design Token
表格组件 模板式(el-table-column 配置式(columns 数组)
表单验证 async-validator(内置) rc-field-form(内置)
学习曲线 低,模板语法直观 中等,需理解 JSX 和 Hooks
文档质量 中文为主,示例丰富 中英双语,非常完善

什么时候用哪个?

场景选择原因
公司用 Vue 技术栈 Element Plus Vue 生态中最成熟的组件库
公司用 React 技术栈 Ant Design React 生态中最成熟的组件库
搭后台管理系统(React) Ant Design + ProComponents ProTable/ProForm 开箱即用,开发效率极高
快速出原型 Demo 都可以 你哪个熟就用哪个
需要国际化(多语言) Ant Design 国际化支持更完善
面试怎么说?

"我主要用 Element Plus(或 Ant Design),能独立搭建包含搜索、表格、分页、增删改查的完整后台页面。两者我都了解,核心区别是框架绑定:Vue 选 Element,React 选 Ant Design。"

10 · 面试考点 Top 5

Q1:为什么要用组件库?不用行不行?

:不用组件库当然可以,但是:

  • 效率:自己写一个带分页的表格至少 3 天,用组件库 10 分钟
  • 一致性:组件库保证所有按钮、输入框、间距风格统一
  • 可访问性:组件库内置键盘导航、ARIA 标签等无障碍支持
  • 浏览器兼容:组件库帮我们处理了各种浏览器的兼容问题
  • 维护性:社区活跃,bug 有人修,新功能有人加

一句话总结:组件库让你把精力花在业务逻辑上,而不是造轮子

Q2:Element Plus 和 Ant Design 怎么选?

:核心原则是看技术栈

  • Vue 项目 → Element Plus(最成熟、中文生态最好)
  • React 项目 → Ant Design(设计规范最完善、ProComponents 超强)

如果搭后台管理系统,Ant Design 的 ProComponents 能大幅提升效率。Element Plus 的学习曲线更低,适合新手入门。

Q3:如何自定义组件库的主题?

Element Plus

  • 通过 CSS 变量覆盖:Element Plus 使用 CSS 变量管理主题色
  • 直接在全局 CSS 中覆盖 --el-color-primary 等变量

Ant Design 5.x

  • 使用 <ConfigProvider theme={{ token: { colorPrimary: '#1890ff' } }}>
  • 通过 Design Token 机制,支持运行时动态切换主题(暗色模式等)
Q4:表格组件如何处理大数据量(几万行)?

:这是经典面试题,答案分三个层次:

  1. 后端分页(最常用):每次只请求当前页的数据,20-50 条。前端表格不关心总数据量。
  2. 虚拟滚动:如果必须在前端显示大量数据(如 1 万行),用虚拟滚动技术——只渲染可视区域的 DOM。
    Element Plus: <el-table-v2>(虚拟化表格)
    Ant Design: 配置 virtual 属性
  3. 懒加载:滚动到底部时加载下一页数据(无限滚动)
Q5:表单验证怎么实现?

Element Plus

  • <el-form> 上绑定 :rules,在 <el-form-item> 上设置 prop
  • 支持 required(必填)、min/max(长度)、pattern(正则)、validator(自定义函数)
  • 提交时调用 formRef.validate() 触发验证

Ant Design

  • <Form.Item> 上设置 rules 属性
  • 语法类似,也支持 required、pattern、validator
  • 使用 Form.useForm() hook 管理表单实例

核心原理相同:定义规则 → 绑定到表单项 → 提交时触发验证 → 显示错误信息。

Element UI 与 Ant Design 速查 — 中际旭创 · 制造业数据可视化工程师培训资料

掌握组件库 = 掌握后台开发的高效工具。祝学习顺利!