Vue 2项目Element-UI从安装到实战:完整引入与按需加载指南

📅 2026/8/13 9:40:45
Vue 2项目Element-UI从安装到实战:完整引入与按需加载指南
1. 项目概述为什么是Element-UI如果你正在用Vue.js做后台管理系统、中后台应用或者任何一个需要快速搭建出专业、统一界面的项目那么Element-UI这个名字你肯定绕不开。它不是第一个但绝对是国内Vue生态中最成功、应用最广泛的UI组件库之一。我第一次接触它是在2017年当时为了赶一个内部管理系统的进度从零开始搭界面简直让人头大直到发现了Element-UI那种“开箱即用”的畅快感至今记忆犹新。它提供了一整套基于Vue 2.x的桌面端组件从按钮、表单、表格这种基础元素到对话框、导航菜单、步骤条等复杂布局全都帮你封装好了而且设计语言统一、文档清晰。对于前端新手或者追求开发效率的团队来说它能让你把精力从反复雕琢按钮圆角、对齐像素这些细节中解放出来更专注于业务逻辑本身。当然现在Vue 3已经普及其官方继任者Element Plus也早已发布并成为主流但对于维护存量Vue 2项目或者学习经典组件库设计思想而言掌握Element-UI依然具有很高的实用价值。本教程的目的就是带你从零开始完成Element-UI的安装、引入并理解其核心使用模式让你能快速上手为你的Vue 2项目注入高效的生产力。2. 环境准备与项目创建在引入任何第三方库之前一个稳定、规范的开发环境是基石。对于Element-UI而言它的运行依赖于Vue.js和现代JavaScript构建工具链。2.1 核心依赖Node.js与npmElement-UI通常通过npm或yarn进行安装这要求你的开发机器上必须装有Node.js。Node.js不仅提供了npm这个包管理器其附带的npx工具也能让我们方便地初始化项目。如何检查与安装打开你的终端或命令行工具输入node -v和npm -v。如果能看到版本号例如v16.14.0和8.3.1说明环境已就绪。如果未安装请前往Node.js官网下载LTS长期支持版本进行安装安装过程基本是“下一步”到底非常友好。注意建议始终使用LTS版本它在稳定性和兼容性上更有保障能避免很多因Node版本过新或过旧导致的诡异问题。我曾在一次团队协作中因为一个成员使用了最新的Current版本导致某些依赖编译失败折腾了半天才发现是版本兼容性问题。2.2 创建Vue项目Vue CLI是首选虽然你可以手动配置Webpack来搭建Vue项目但对于初学者和绝大多数项目我强烈推荐使用Vue CLI。它是一个标准化的项目脚手架工具能一键生成配置完善、最佳实践的项目结构。安装与创建项目步骤全局安装Vue CLI在终端中运行npm install -g vue/cli。安装完成后可以通过vue --version验证。创建新项目找一个合适的目录执行vue create my-element-project。这里的my-element-project是你的项目名可以按需修改。选择预设CLI会交互式地让你选择配置。对于学习Element-UI选择Default ([Vue 2] babel, eslint)这个Vue 2的默认预设就完全足够了。它包含了Babel转译和ESLint代码检查足以满足开发需求。等待初始化这个过程会从npm仓库拉取所有初始依赖并完成安装耐心等待即可。进入项目并运行cd my-element-project npm run serve执行npm run serve后CLI会启动一个开发服务器。通常在终端中会输出App running at:并附带一个本地地址如http://localhost:8080/用浏览器打开它看到Vue的欢迎页面说明项目创建成功。实操心得在vue create时如果你确信项目不需要路由、状态管理Vuex等就选最简单的预设保持项目纯净。后期有需要再通过vue add命令按需添加这样能避免初始项目结构过于复杂。另外npm run serve启动后这个终端窗口就会被开发服务器占用你需要另开一个终端窗口来执行后续的安装命令。3. Element-UI的安装与全局引入项目跑起来后我们就可以正式引入Element-UI了。引入方式主要有两种完整引入和按需引入它们各有适用场景。3.1 安装Element-UI包在项目根目录下即package.json所在的目录打开一个新的终端窗口执行安装命令npm i element-ui -S这里的-S是--save的简写表示将依赖记录到package.json的dependencies中。安装完成后你可以在package.json文件里看到新增了一行element-ui: ^2.15.14版本号可能不同。3.2 方式一完整引入适合快速原型与小型项目完整引入是最简单粗暴的方式它会将Element-UI的所有组件和样式一次性全部引入到你的项目中。实现步骤找到项目的入口文件。对于Vue CLI创建的项目通常是src/main.js。在main.js中添加以下几行代码import Vue from vue; import ElementUI from element-ui; // 导入Element-UI库 import element-ui/lib/theme-chalk/index.css; // 导入Element-UI的样式文件 Vue.use(ElementUI); // 全局注册所有Element-UI组件 new Vue({ render: h h(App), }).$mount(#app);关键点在于这三行导入库、导入样式、通过Vue.use()注册。优点与缺点优点配置极其简单无需任何额外操作即可在项目的任何Vue组件中直接使用el-button、el-table等所有组件。缺点打包后的文件体积会显著增大因为它包含了所有你可能用不到的组件代码。对于生产环境特别是对首屏加载速度有要求的项目这不是最佳选择。适合场景非常适合用于学习、 demo 演示、内部工具或非常小型的项目追求极致的开发体验。3.3 方式二按需引入推荐用于生产环境按需引入是生产项目的标准做法。它借助Babel插件只将你实际使用到的组件代码打包进去能有效减小最终打包体积。实现步骤安装Babel插件首先需要安装一个辅助的Babel插件。npm install babel-plugin-component -D这里的-D表示作为开发依赖安装。修改Babel配置在项目根目录下找到或创建babel.config.js文件。Vue CLI 3 的项目通常都有这个文件。在其中添加plugins配置module.exports { presets: [ vue/cli-plugin-babel/preset ], plugins: [ [ component, { libraryName: element-ui, styleLibraryName: theme-chalk } ] ] }这段配置告诉Babel当遇到从element-ui库中导入的组件时自动进行按需加载处理并引入对应的样式来自theme-chalk。在组件中局部引入现在你不再需要在main.js中全局引入ElementUI。相反在你需要使用某个组件的.vue文件中单独引入它。template div el-button typeprimary主要按钮/el-button el-date-picker v-modeldateValue typedate/el-date-picker /div /template script // 按需引入需要的组件 import { Button, DatePicker } from element-ui; export default { name: MyComponent, components: { // 将引入的组件注册为当前组件的局部组件 el-button: Button, el-date-picker: DatePicker }, data() { return { dateValue: }; } }; /script这样做的好处是如果你的其他组件没有用到Button或DatePicker它们就不会被打包进来。核心原理与选择建议按需引入的核心是“编译时优化”。Babel插件在编译你的代码时会识别import { Button } from element-ui这样的语句并将其转换为对单独组件文件的引用。而完整引入是“运行时全部可用”。 对于新手我建议先从完整引入开始快速体验所有组件验证功能。当项目要上线或你对体积敏感时再切换到按需引入。切换过程是渐进式的你可以在新组件中开始使用按需引入旧组件慢慢重构两者甚至可以共存一段时间。4. 基础组件使用与核心概念解析安装并引入后我们终于可以开始使用组件了。Element-UI的组件设计遵循一致的API规范理解几个核心概念能让你举一反三。4.1 组件命名与使用规范所有Element-UI组件都以el-前缀开头例如el-button,el-input,el-table。在模板中使用时你需要遵循kebab-case短横线分隔的写法这与Vue的自定义组件规范一致。一个完整的按钮组件示例template div !-- 基础用法 -- el-button默认按钮/el-button el-button typeprimary主要按钮/el-button el-button typesuccess成功按钮/el-button el-button typewarning警告按钮/el-button el-button typedanger危险按钮/el-button el-button typeinfo信息按钮/el-button !-- 带图标和属性的按钮 -- el-button typeprimary iconel-icon-search :loadingisLoading clickhandleClick 搜索 /el-button !-- 禁用状态 -- el-button :disabledtrue禁用按钮/el-button /div /template script export default { data() { return { isLoading: false }; }, methods: { handleClick() { this.isLoading true; // 模拟异步操作 setTimeout(() { this.isLoading false; console.log(点击事件处理完毕); }, 1000); } } }; /script从这个例子可以看到几个关键点type属性定义了按钮的语义化样式是Element-UI组件中最常用的属性之一。icon属性用于添加图标值来自Element-UI内置的图标库以el-icon-开头。:loading属性这是一个动态属性绑定到组件的isLoading状态用于显示加载动画。冒号:是v-bind:的简写表示绑定JavaScript表达式。click事件这是v-on:click的简写用于监听组件的点击事件并触发handleClick方法。:disabled属性控制组件的禁用状态。4.2 表单组件的双向数据绑定表单是后台系统最常用的部分Element-UI提供了el-form、el-form-item、el-input、el-select等一整套表单组件。其核心是配合Vue的v-model指令实现数据的双向绑定。一个登录表单的典型示例template el-form :modelloginForm :rulesloginRules refloginFormRef label-width80px el-form-item label用户名 propusername el-input v-modelloginForm.username placeholder请输入用户名/el-input /el-form-item el-form-item label密码 proppassword el-input v-modelloginForm.password typepassword placeholder请输入密码 show-password/el-input /el-form-item el-form-item label记住我 propremember el-switch v-modelloginForm.remember/el-switch /el-form-item el-form-item el-button typeprimary clicksubmitForm(loginFormRef)登录/el-button el-button clickresetForm(loginFormRef)重置/el-button /el-form-item /el-form /template script export default { data() { // 定义表单数据对象 return { loginForm: { username: , password: , remember: false }, // 定义表单验证规则 loginRules: { username: [ { required: true, message: 请输入用户名, trigger: blur }, { min: 3, max: 10, message: 长度在 3 到 10 个字符, trigger: blur } ], password: [ { required: true, message: 请输入密码, trigger: blur }, { min: 6, message: 密码长度不能少于6位, trigger: blur } ] } }; }, methods: { submitForm(formName) { // 通过$refs获取表单组件实例并调用其validate方法 this.$refs[formName].validate((valid) { if (valid) { // 验证通过执行登录逻辑 console.log(提交表单:, this.loginForm); // 这里可以发起Ajax请求... } else { console.log(表单验证失败); return false; } }); }, resetForm(formName) { // 重置表单 this.$refs[formName].resetFields(); } } }; /script核心概念解析el-form的属性:model这是必须的它绑定了整个表单的数据对象这里是loginForm。所有表单项的v-model都指向这个对象的属性。:rules绑定表单验证规则对象loginRules。ref给表单组件注册一个引用ID使得我们可以在JavaScript中通过this.$refs.loginFormRef访问到组件实例从而调用其validate、resetFields等方法。label-width设置所有表单项标签的宽度。el-form-item的属性prop这个属性至关重要它必须设置为model中对应字段的键名如username。这样验证规则才会知道该验证哪个字段。label表单项的标签文本。v-model在el-input、el-switch等输入组件上直接使用v-model绑定到loginForm的具体属性上实现了数据的自动同步。验证规则loginRules是一个对象其属性名对应prop。每个属性值是一个数组包含多条规则对象。每条规则可以定义required必填、min/max长度、type类型、validator自定义函数等并指定trigger触发时机如blur失去焦点时、change值改变时。重要提示很多新手会忘记设置el-form的:model或el-form-item的prop导致验证功能完全失效。请务必记住这三者model、rules、prop是联动工作的缺一不可。4.3 布局与容器组件一个美观的界面离不开合理的布局。Element-UI提供了el-row和el-col组件来实现基于24分栏的栅格系统以及el-container系列组件进行整体布局。栅格布局示例template div el-row :gutter20 !-- gutter 设置列间隔 -- el-col :span6div classgrid-content bg-purple占6栏/div/el-col el-col :span12div classgrid-content bg-purple-light占12栏/div/el-col el-col :span6div classgrid-content bg-purple占6栏/div/el-col /el-row el-row :gutter20 el-col :span8 :offset4 !-- offset 设置左侧偏移栏数 -- div classgrid-content bg-purple-light占8栏左侧偏移4栏/div /el-col el-col :span8 div classgrid-content bg-purple占8栏/div /el-col /el-row /div /template style scoped .el-row { margin-bottom: 20px; } .grid-content { border-radius: 4px; min-height: 36px; line-height: 36px; text-align: center; color: #fff; } .bg-purple { background: #d3dce6; } .bg-purple-light { background: #e5e9f2; } /style布局容器示例常见后台框架结构template el-container styleheight: 100vh; !-- 容器占满视口高度 -- el-aside width200px stylebackground-color: #545c64; !-- 侧边栏通常放导航菜单 -- el-menu default-active1 background-color#545c64 text-color#fff active-text-color#ffd04b el-menu-item index1首页/el-menu-item el-submenu index2 template slottitle用户管理/template el-menu-item index2-1用户列表/el-menu-item el-menu-item index2-2角色管理/el-menu-item /el-submenu /el-menu /el-aside el-container el-header stylebackground-color: #409EFF; color: white; line-height: 60px; 这里是头部 /el-header el-main stylepadding: 20px; !-- 主要内容区域 -- 这里是页面主要内容 el-card classbox-card div slotheader classclearfix span卡片名称/span /div div卡片内容/div /el-card /el-main el-footer stylebackground-color: #B3C0D1; color: #333; line-height: 60px; 这里是底部 /el-footer /el-container /el-container /template通过el-container、el-header、el-aside、el-main、el-footer的组合可以快速搭建出标准的后台管理页面骨架。el-card组件则为内容块提供了良好的视觉容器。5. 主题定制与样式覆盖虽然Element-UI默认的主题theme-chalk已经很优雅但为了匹配品牌色或独特设计我们经常需要定制主题。主要有两种方式SCSS变量覆盖和直接CSS覆盖。5.1 通过SCSS变量进行全局主题定制推荐这是最彻底、最规范的主题定制方式。Element-UI的样式是基于SCSS编写的并暴露了大量的全局SCSS变量供我们覆盖。操作步骤安装Sass预处理器Vue CLI项目通常已内置支持但需要安装sass和sass-loader。npm install sass sass-loader^10 -D注意sass-loader的版本需要与你的Webpack版本匹配。Vue CLI 4/5通常对应sass-loader^10。如果安装最新版报错可以尝试指定这个版本。创建主题变量文件在src目录下创建一个样式文件例如src/styles/element-variables.scss。覆盖变量在这个文件中定义你想要覆盖的变量。你可以从Element-UI源码的packages/theme-chalk/src/common/var.scss中找到所有可用变量。常用变量如下// src/styles/element-variables.scss /* 改变主题色变量 */ $--color-primary: #1890ff; // 将默认的蓝色改为Ant Design风格的蓝色 /* 改变其他主题色 */ $--color-success: #67c23a; $--color-warning: #e6a23c; $--color-danger: #f56c6c; $--color-info: #909399; /* 改变字体路径变量必须否则图标会显示异常 */ $--font-path: ~element-ui/lib/theme-chalk/fonts; /* 引入Element-UI的默认主题变量以便覆盖 */ import ~element-ui/packages/theme-chalk/src/index;最后一行import非常重要它会在你的变量定义之后引入Element-UI的完整样式这样你的覆盖才会生效。在项目中引入变量文件修改你的入口文件src/main.js将原来引入CSS文件的那一行替换为引入你的SCSS变量文件。// 注释掉或删除原来的CSS引入 // import element-ui/lib/theme-chalk/index.css; // 引入自定义主题的SCSS文件 import ./styles/element-variables.scss;如果你使用的是按需引入则不需要在main.js中引入样式但需要确保babel.config.js中的styleLibraryName配置正确指向theme-chalk并且你的自定义变量文件被正确编译。更常见的做法是在项目的全局样式文件如src/App.vue或src/main.js中引入这个变量文件确保它最先被加载。实操心得SCSS变量覆盖是“一劳永逸”的全局方案。修改一个颜色变量所有使用该变量的组件按钮、链接、标签等颜色都会同步改变。在团队协作中这能保证主题的一致性。务必记得修改$--font-path否则图标字体文件可能加载失败导致图标显示为小方块。5.2 通过CSS进行局部样式覆盖有时我们只需要对某个特定页面或组件的Element-UI样式做微调这时可以使用CSS选择器进行覆盖。方法在你的组件style标签中使用深度选择器来覆盖子组件样式。template div classmy-page el-button classcustom-btn自定义按钮/el-button el-dialog title提示 :visible.syncdialogVisible span这是一段内容/span /el-dialog /div /template style scoped /* 使用 /deep/ 或 深度选择器Vue 2语法 */ .my-page /deep/ .el-button.custom-btn { background-color: #ff9900; border-color: #ff9900; } .my-page /deep/ .el-dialog__header { background-color: #f0f9ff; } /style注意在Vue 2的单文件组件中当style标签有scoped属性时样式默认只影响当前组件。要影响子组件如el-button的根元素可以使用/deep/或深度选择器。在Vue 3中推荐使用::v-deep()语法。选择策略全局品牌色调整、间距、圆角等基础设计 token 变更优先使用SCSS变量覆盖。特定页面中某个组件的独特样式、紧急修复UI bug使用CSS局部覆盖并注意选择器的优先级必要时可加上!important但应谨慎使用。6. 常见问题排查与实战技巧在实际开发中你一定会遇到各种各样的问题。这里我总结了一些高频问题和对应的解决思路。6.1 图标不显示问题这是最常见的问题之一表现为图标位置显示为小方块或空白。排查步骤检查样式是否正确引入如果你使用完整引入确保import element-ui/lib/theme-chalk/index.css;这行代码存在且路径正确。如果你使用按需引入确保babel.config.js中的styleLibraryName配置为theme-chalk。检查字体文件路径如果自定义了主题务必在SCSS变量文件中正确设置$--font-path。这个路径是相对于最终打包后CSS文件的位置。使用~element-ui/lib/theme-chalk/fonts通常能由Webpack正确解析。检查网络请求打开浏览器的开发者工具F12切换到“网络(Network)”标签页刷新页面查看是否有字体文件.ttf, .woff等的请求并且状态是否为200成功。如果请求失败404说明路径配置错误。图标名称是否正确确保icon属性值以el-icon-开头例如el-icon-search而不是search。6.2 表单验证不触发或无效排查步骤黄金三角检查确认el-form上绑定了:model、:rules并且el-form-item上设置了prop属性且prop的值必须是model对象中存在的字段名。这是最常见的原因。验证规则检查检查rules对象中的规则定义是否正确。例如required: true而不是required: ‘true‘字符串。触发时机检查trigger属性默认为blur即失去焦点时触发。如果你在输入过程中就想验证可以设置为change或者设置为[blur, change]数组。手动调用验证通过this.$refs.formName.validate()手动触发验证时确保ref名称正确且该方法在表单DOM渲染完成后调用通常在this.$nextTick中。6.3 按需引入后组件未注册错误错误信息类似于[Vue warn]: Unknown custom element: el-button - did you register the component correctly?排查步骤检查导入语句确保在.vue文件中正确导入了组件例如import { Button } from element-ui;。检查注册语句确保在components选项中正确注册了组件例如components: { el-button: Button }。注册的组件名el-button必须与模板中使用的标签名完全一致。检查Babel配置确认babel.config.js中的babel-plugin-component插件配置正确并且已安装。重启开发服务器有时修改Babel配置后需要重启npm run serve才能生效。6.4 表格el-table性能优化技巧当表格数据量很大如超过1000行时可能会出现渲染卡顿。优化方案使用虚拟滚动Element-UI本身不支持虚拟滚动。对于超大数据量可以考虑使用专门的虚拟滚动表格组件或使用vue-virtual-scroller等库自行封装。这是最根本的解决方案。分页这是最常用且有效的方案。通过后端API分页或前端分页每次只渲染一页数据。懒加载对于树形表格或可展开表格使用懒加载方式只在展开时加载子数据。减少不必要的响应式数据对于纯粹展示、不需要动态更新的超大数据列可以使用Object.freeze()冻结数据避免Vue为其每个属性创建响应式getter/setter能大幅提升初始化性能。this.tableData Object.freeze(apiResponse.hugeList);避免在表格列中使用复杂模板或组件如果必须在单元格内渲染复杂内容考虑将其提取为独立的子组件并利用Vue的异步组件或v-once指令进行优化。6.5 自定义组件并保持与Element风格一致当你需要创建一个Element-UI中没有的组件但又希望它看起来像是Element家族的一员时可以这样做复用样式类名直接使用Element-UI的CSS类名。例如给你的按钮添加el-button el-button--primary类。使用Mixins混合如果你的自定义组件是Vue组件可以创建一个Mixin封装一些Element组件共有的行为或样式逻辑。例如一个处理“禁用”状态和“尺寸”的Mixin。参考源码直接去GitHub上查看Element-UI对应组件的源码学习其DOM结构、类名组织和样式写法这是最直接的学习方式。7. 从Element-UI到Element Plus的平滑升级思考虽然本教程聚焦于Vue 2的Element-UI但技术总是在演进。Element Plus是Element-UI面向Vue 3的官方升级版本它带来了性能提升、更好的TypeScript支持以及一些新的组件和特性。如果你的新项目技术选型是Vue 3那么应该直接选择Element Plus。其安装和使用方式与Element-UI非常相似核心概念一脉相承因此掌握Element-UI会对你学习Element Plus有极大帮助。对于现有的Vue 2 Element-UI项目升级是一个系统工程需要评估升级Vue 3这是前提可能涉及大量代码的破坏性变更。替换UI库将element-ui依赖替换为element-plus并修改所有导入路径从element-ui改为element-plus。API变更适配Element Plus并非100%兼容Element-UI部分组件的属性、事件、插槽名称有变化需要参照官方迁移指南逐一修改。构建工具升级确保Webpack、Babel等工具链支持Vue 3。因此对于大型存量项目升级需要周密的计划和测试。一个可行的策略是在新功能或重构的模块中尝试引入Element Plus逐步替换最终实现整体迁移。