elementui是饿了么前端团队开源的一套基于Vue的桌面端组件库,它提供了几十种开箱即用的UI组件,包括按钮、表单、表格、分页、弹窗、导航菜单、日期选择器等,几乎覆盖了后台管理系统的所有常见界面需求。它的名字由element(元素)和UI(用户界面)两部分组成,含义是提供一套原子化的界面元素供开发者自由组合。很多初学者第一次听说它时都会疑惑:elementui和vue到底是什么关系?能不能单独使用?本文就来把这两个概念彻底讲清楚。

elementui和vue的关系详解
要理解两者的关系,可以先打个比方:vue相当于汽车的发动机和底盘,提供了数据驱动视图、组件化开发、响应式更新等核心能力;而elementui则是基于这套底盘制造出来的一整套车身部件,比如方向盘、座椅、仪表盘,装上之后整车就能直接开走。elementui本身不是框架,它是一个组件库,其内部每一个组件都是用vue的语法编写的,必须运行在vue的环境里。
具体到版本层面有一个非常重要的坑需要注意:elementui(即Element UI)只支持Vue 2.x,而Element Plus才是面向Vue 3的版本。如果你在Vue 3项目中通过npm install element-ui安装并注册,控制台会报错甚至页面直接白屏,因为Vue 3移除了很多Vue 2的API。简单记忆就是:Vue 2配elementui,Vue 3配Element Plus,两套库不能混用。
从工程角度看,elementui依赖vue提供的能力主要有三点:一是组件系统,elementui的每个组件都通过Vue.component注册,借助vue的生命周期钩子完成初始化与销毁;二是响应式数据绑定,表格、表单等组件的双向绑定依赖vue的v-model语法糖;三是插槽机制,很多组件的自定义内容渲染都依赖vue的slot能力。可以说没有vue,elementui的代码一行都跑不起来。
elementui的安装与基本使用
在Vue 2项目中使用elementui非常简单。首先确保项目已经搭建好,然后通过npm安装:
npm install element-ui --save
安装完成后,在项目的入口文件main.js中引入组件库和样式,并调用Vue.use完成全局注册:
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'
Vue.use(ElementUI)
new Vue({
render: h => h(App)
}).$mount('#app')全局引入的方式最简单,适合中小型项目。如果项目对体积比较敏感,也可以采用按需引入的方案,借助babel-plugin-component插件,只打包实际用到的组件,能显著减小最终构建产物的体积。按需引入的配置写法如下:
// 安装:npm install babel-plugin-component -D
// babel.config.js 中配置按需引入
module.exports = {
presets: ['@vue/app'],
plugins: [
['component', {
libraryName: 'element-ui',
styleLibraryName: 'theme-chalk'
}]
]
}
// 组件中按需引入
import { Button, Table, Form, MessageBox } from 'element-ui'
Vue.use(Button)
Vue.use(Table)
Vue.use(Form)
Vue.prototype.$confirm = MessageBox.confirm注册完成后,就可以在任意单文件组件的模板中直接使用elementui的组件了。例如一个带图标和加载状态的按钮:
<template>
<div>
<el-button type="primary" icon="el-icon-search" :loading="isLoading">
查询
</el-button>
</div>
</template>注意所有elementui组件都以el-作为前缀,例如el-table、el-form、el-dialog,这也是区分elementui组件和自定义组件最直观的标志。
elementui常见错误与解决方法
实际开发中,elementui的报错大多集中在版本不匹配、引入方式不对、异步渲染时机这几类,下面逐一分析。
第一类:Vue 3项目误装elementui导致白屏或报错。现象是安装element-ui后启动项目,控制台出现类似Cannot read properties of undefined的错误,页面空白。原因是elementui内部使用了Vue 2独有的API。解决办法是卸载element-ui,改用Element Plus:
npm uninstall element-ui npm install element-plus --save
// main.js 中改为 element-plus 的引入方式
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
createApp(App).use(ElementPlus).mount('#app')第二类:组件在页面上不显示但也不报错。常见原因有三种:一是忘记在main.js中执行Vue.use(ElementUI),组件根本没有被注册;二是使用了局部按需引入,却没有在当前组件的components选项中声明;三是模板中组件名写错,比如把el-table写成了el-Table或eltable。逐一排查这三点基本都能解决。
第三类:样式完全失效,页面组件功能正常但没有任何样式。这几乎都是因为忘记引入样式文件。检查main.js中是否存在import 'element-ui/lib/theme-chalk/index.css'这一行。如果按需引入时样式失效,则要检查babel-plugin-component是否安装并正确配置了styleLibraryName选项,同时别忘了重新启动开发服务器让babel配置生效。
第四类:表单校验不生效。这是新手提问频率最高的问题之一,典型错误写法如下:
<el-form :model="form" :rules="rules">
<el-form-item prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
</el-form>校验失效的常见原因有三个:一是el-form-item缺少prop属性,rules中的字段名找不到对应项;二是rules里的字段名与form数据对象的字段名不一致;三是自定义校验函数忘记调用callback,导致校验流程卡住。正确写法必须保证model、rules、prop三者字段名完全一致,自定义validator中无论成功还是失败都要调用callback:
rules: {
name: [
{ required: true, message: '请输入名称', trigger: 'blur' },
{ validator: (rule, value, callback) => {
if (value && value.length >= 2) {
callback()
} else {
callback(new Error('名称至少两个字'))
}
}, trigger: 'blur' }
]
}第五类:弹窗关闭后再打开,表单里还残留上一次的数据。这是因为dialog内部缓存了组件状态。解决办法是在el-dialog关闭时重置表单,可以利用close事件或者destroy-on-close属性,也可以调用表单实例的resetFields方法:
<el-dialog title="编辑" :visible.sync="dialogVisible" @close="resetForm">
<el-form ref="formRef" :model="form">
<!-- 表单项 -->
</el-form>
</el-dialog>
<script>
export default {
methods: {
resetForm() {
this.$refs.formRef.resetFields()
}
}
}
</script>第六类:表格数据更新后页面不刷新。如果表格绑定的是通过索引直接赋值或delete操作修改的数组,vue 2无法侦测到这种变更。解决方法是使用this.$set来修改数组元素,或者整个替换数组对象,例如this.tableData = newArr。
使用elementui的几点建议
在项目选型时,如果团队使用Vue 2且主要做后台管理系统,elementui依然是性价比极高的选择,文档齐全、社区问题积累多,几乎任何坑都能搜到答案。如果是新项目,建议直接上Vue 3加Element Plus,获得更好的TypeScript支持和性能。
在编码习惯上,建议优先使用按需引入控制包体积;主题定制可以通过覆盖theme-chalk的SCSS变量实现,而不必手动修改每个组件的样式;对于MessageBox、Notification这类以js方式调用的组件,记得在按需引入时单独挂载到Vue.prototype上,否则调用this.$message时会提示 undefined。
总的来说,elementui的本质就是一个为vue量身定制的组件库,理解了它依赖vue组件系统和响应式机制这一点,遇到问题时就能顺着原理去定位,而不是盲目地复制粘贴报错信息。掌握了上面这些常见错误的排查思路,日常开发中百分之九十的elementui问题都能自己快速解决。