Element Plus

Element Plus UI 组件库使用指南

#tech / dev / frame #resource / vue3 #type / howto #status / growing

Element Plus

基础概念

Element Plus 是饿了么团队开发的 Vue 3 UI 组件库,是 Element UI(Vue 2 版本)的升级替代品。

与 Element UI 的主要区别

对比项Element UIElement Plus
Vue 版本Vue 2Vue 3
包名element-uielement-plus
按需导入需要 babel-plugin使用 unplugin-vue-components(更简单)
类型支持完整 TypeScript 类型
CSS 变量不支持支持 CSS Variables 主题
Composition API不支持完全支持

使用指南

安装

npm install element-plus
# 或
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')

按需导入(推荐,减小包体积)

使用 unplugin-vue-componentsunplugin-auto-import

npm install -D unplugin-vue-components unplugin-auto-import
// 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'

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
})

配置后可以直接在模板中使用组件,无需手动 import:

<template>
  <el-button type="primary">按钮</el-button>
  <el-input v-model="value" placeholder="请输入" />
</template>

主题定制

CSS 变量覆盖(推荐)

/* styles/element-overrides.css */
:root {
  --el-color-primary: #409eff;
  --el-color-success: #67c23a;
  --el-border-radius-base: 4px;
  --el-font-size-base: 14px;
}

SCSS 变量覆盖

// styles/element-variables.scss
@forward "element-plus/theme-chalk/src/common/var.scss" with (
  $colors: (
    "primary": (
      "base": #409eff,
    ),
  ),
);
// main.ts
import './styles/element-variables.scss'
import 'element-plus/dist/index.css'

常用组件模式

表单验证

<template>
  <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
    <el-form-item label="用户名" prop="username">
      <el-input v-model="form.username" />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm(formRef)">提交</el-button>
    </el-form-item>
  </el-form>
</template>

<script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus'

const formRef = ref<FormInstance>()
const form = reactive({ username: '' })
const rules: FormRules = {
  username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
}

const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate((valid) => {
    if (valid) console.log('提交成功')
  })
}
</script>

表格与分页

<template>
  <el-table :data="tableData" stripe>
    <el-table-column prop="name" label="名称" />
    <el-table-column prop="date" label="日期" />
    <el-table-column label="操作">
      <template #default="{ row }">
        <el-button size="small" @click="handleEdit(row)">编辑</el-button>
      </template>
    </el-table-column>
  </el-table>
  <el-pagination
    v-model:current-page="currentPage"
    :page-size="10"
    :total="total"
    layout="total, prev, pager, next"
    @current-change="handlePageChange"
  />
</template>

Table 组件

element-table-merge-cells-guide

实战经验

  • el-dialog 打开时默认会 focus 第一个可聚焦元素,可能导致意外行为,可用 :destroy-on-close="true" 避免
  • el-select 远程搜索时注意防抖,避免频繁请求
  • 大量表格数据考虑使用虚拟滚动(el-table-v2
  • el-formresetFields() 会重置为初始值,不是清空

经验总结

  • 新项目推荐按需导入,显著减小打包体积
  • 主题定制优先用 CSS 变量方案,维护成本最低
  • Element Plus 的 TypeScript 支持很好,善用类型提示提高开发效率

信息参考

创建于 2025/10/10 更新于 2026/5/27