修改element-ui源码实现el-dialog自定义全屏功能
本文介绍如何在不封装组件的前提下,通过直接修改element-ui源码为el-dialog添加自定义全屏功能。步骤包括克隆官方仓库、修改component.vue中的模板与逻辑、打包生成lib文件夹,并利用patch-package生成补丁文件,最终通过postinstall命令自动应用补丁,实现项目内所有dialog的全屏控制。
背景:
element-ui自带的el-dialog组件虽然内置了全屏功能,但在实际业务场景中往往无法满足特定需求。由于系统中大量使用了dialog组件,逐一重新封装成本过高,因此选择直接修改element-ui的源代码来实现这一功能。
1.克隆element官方的仓库到本地
git clone https://github.com/ElemeFE/element2.进入下载好的本地项目目录,执行命令安装所需的依赖包。
cd elementnpm install3.打开package文件夹,对源代码进行针对性修改。
具体需要修改的文件路径为 package/dialog/src/component.vue。
模板部分(template):
<!-- div role="dialog" 的class修改为:-->
:class="['el-dialog', { 'is-fullscreen': isFullscreen, 'el-dialog--center': center }, customClass]"
<!-- 在button aria-label="Close"前添加按钮: -->
<button type="button" class="el-dialog__headerbtn" aria-label="Fullscreen" style="right: 46px;" v-if="fullscreen" @click="handleFullscreen">
<i class="el-dialog__close el-icon el-icon-full-screen"></i>
</button>脚本部分(script):
props: {
...,
fullscreen: { // 修改fullscreen属性,默认为true
type: Boolean,
default: true,
},
...
}
data() {
return {
isFullscreen: false, // 新增全屏状态
...
};
},
computed: {
style() {
let style = {};
if (!this.isFullscreen) { // 判断isFullscreen
style.marginTop = this.top;
if (this.width) {
style.width = this.width;
}
}
return style;
},
},
methods: {
// 新增toggle方法
handleFullscreen() {
this.isFullscreen = !this.isFullscreen;
},
...
}4.打包我们修改后的源码
npm run dist执行打包命令后,项目根目录下会生成一个 lib 文件夹,该文件夹后续将被用于替换原有组件。
5.安装 patch-package
npm i patch-package --save-dev6.替换项目中的 element-ui
首先定位到 node_modules/element-ui/ 目录,删除该目录下的 lib 文件夹。
接着,将步骤4中生成的 lib 文件夹拷贝到 node_modules/element-ui/ 目录下,以覆盖原有文件。
7.生成 patches 补丁文件
npx patch-package package-name执行相关命令后,项目根目录会生成一个 patches/element-ui+2.15.6.patch 的补丁文件,记录了对源码的修改。

8.新增 postinstall 命令
在 package.json 的 scripts 配置中添加 "postinstall": "patch-package",确保每次安装依赖时自动应用补丁。

9.重新安装依赖包
删除项目中的 node_modules 文件夹,以清除旧的依赖状态。
npm install 重新安装依赖并重启项目,使修改生效。
参考
前端大屏自适应方案:缩放与视口单位对比
2026-10-31 18:19:27
前端大文件分片下载实现:基于localForage与Vue的完整方案
2026-10-31 16:11:47
Vue3 中使用 VueUse 实现指定区域全屏阅读功能
2026-10-31 13:55:05
基于Vue与Pinia实现页面Loading动画及请求拦截处理
2026-10-31 13:54:42
Vue封装Echarts通用组件:Vue2/Vue3 JS/TS三种模板及常用配置事件详解
2026-10-31 11:38:03
