@hz_yujin/vue2-base-dialog

Vue 2 ProDialog:基于 Element UI el-dialog 的样式包装器,统一风格并透传全部弹层逻辑(兼容 Vue 2.6 / 2.7)
1,035
Install
npm install @hz_yujin/vue2-base-dialog
Latest Version:0.1.5
Vue:2
License:MIT
Last Updated:Sep 20, 2026
Links: npm
Maintainer: hz_yujin

@hz_yujin/vue2-base-dialog

基于 Vue 2.6 / 2.7 + Element UI el-dialog 的样式包装器。

  • 弹层逻辑全部复用 Element(遮罩、ESC、beforeClose、z-index、全屏等)
  • 本包只统一皮肤、尺寸预设与默认底部操作区
  • 删改确认请继续用 $confirm / MessageBox(本包提供层级协同)

安装

npm install @hz_yujin/vue2-base-dialog element-ui

注册

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Vue2BaseDialog from '@hz_yujin/vue2-base-dialog'
import '@hz_yujin/vue2-base-dialog/style.css'

Vue.use(ElementUI)
Vue.use(Vue2BaseDialog)
// 可选:Vue.use(Vue2BaseDialog, { prefix: 'Hz', zIndex: 12000 })

基础用法

<template>
  <div>
    <el-button type="primary" @click="visible = true">打开</el-button>

    <ProDialog
      v-model="visible"
      title="编辑用户"
      size="medium"
      :confirm-loading="saving"
      @confirm="handleSave"
      @cancel="visible = false"
    >
      <el-form label-width="80px" size="small">
        <!-- 表单内容 -->
      </el-form>
    </ProDialog>
  </div>
</template>

<script>
export default {
  data() {
    return { visible: false, saving: false }
  },
  methods: {
    async handleSave() {
      this.saving = true
      try {
        // await api.save(...)
        this.visible = false
      } finally {
        this.saving = false
      }
    },
  },
}
</script>

也可用 :visible.sync="visible" 控制显隐(与 v-model 二选一即可)。

Props

Prop 类型 默认 说明
value Boolean false 显隐,配合 v-model
visible Boolean — 显隐,配合 :visible.sync;传入时优先于 value
title String '' 标题文案(可用 title 插槽覆盖)
size String 'large' 尺寸预设:small / medium / large / full
width String — 自定义宽度,传入后优先于 size
top String '15vh' 距顶部距离
modal Boolean true 是否显示遮罩
modalAppendToBody Boolean true 遮罩是否插入至 body
appendToBody Boolean true 弹框是否插入至 body
lockScroll Boolean true 是否锁定滚动
destroyOnClose Boolean false 关闭时销毁内容
closeOnClickModal Boolean false 点击遮罩是否关闭
closeOnPressEscape Boolean true 按 ESC 是否关闭
showClose Boolean true 是否显示右上角关闭按钮
center Boolean false 是否居中布局
fullscreen Boolean false 是否全屏
draggable Boolean false 是否可拖拽标题栏移动弹框(全屏时自动禁用)
showFooter Boolean true 是否显示底部栏(有 footer 插槽时也会显示)
showCancel Boolean true 是否显示取消按钮
showConfirm Boolean true 是否显示确定按钮
cancelText String '取消' 取消按钮文案
confirmText String '确定' 确定按钮文案
confirmType String 'primary' 确定按钮 el-button type
confirmLoading Boolean false 确定按钮 loading
confirmDisabled Boolean false 确定按钮禁用
beforeClose Function — 关闭前钩子,签名 (done) => void,需自行调用 done()
customClass String '' 追加到弹框根节点的自定义 class
zIndex Number — 可选。透传 Element Popup;多层弹框请勿写死

未声明的属性会通过 $attrs 继续透传给 el-dialog。

size 与宽度对照

size 宽度
small 420px
medium 560px
large 720px
full 92%

层级约定

场景 z-index
表格全屏(与 table 包约定) 2900
ProDialog / 遮罩 自弹框起点(默认 3000)起由 PopupManager 自动递增
MessageBox 不低于 起点 + 1900,且始终高于当前 PopupManager 顶层
Message / Notification 不低于 起点 + 2000,且始终高于 MessageBox / 当前弹框

弹框多次打开后 PopupManager 会涨过 起点 + 2000;ProDialog 在 open / opened 时会调用 syncPopupLayerAboveCurrent(),把 $message 继续抬到遮罩之上。

import Vue2BaseDialog, {
  setPopupZIndexBase,
  getPopupLayerZIndex,
} from '@hz_yujin/vue2-base-dialog'
import '@hz_yujin/vue2-base-dialog/style.css'

Vue.use(ElementUI, { zIndex: 12000 })
Vue.use(Vue2BaseDialog, { zIndex: 12000 })
// → Dialog 自 12000 起;MessageBox / Message 按 gap 抬高,并跟随已打开弹框顶层

setPopupZIndexBase(12000)
const { messageBox } = getPopupLayerZIndex()

Events

事件 说明
input / update:value v-model 更新
update:visible :visible.sync 更新
confirm 点击确定(不会自动关闭)
cancel 点击取消(会关闭弹框)
open / opened / close / closed 与 Element Dialog 一致

Slots

插槽 说明
默认 弹框主体内容
title 自定义标题区
footer 自定义底部(覆盖默认取消/确定)

主题变量

可通过 CSS 变量微调统一风格:

:root {
  --pro-dialog-radius: 8px;
  --pro-dialog-header-padding: 16px 20px 12px;
  --pro-dialog-body-padding: 16px 20px;
  --pro-dialog-footer-padding: 12px 20px 16px;
  --pro-dialog-border: #ebeef5;
  --pro-dialog-title-color: #303133;
  --pro-dialog-body-color: #606266;
  /* 遮罩:压暗 + 毛玻璃模糊(DeepSeek 风格) */
  --pro-dialog-mask-bg: rgba(0, 0, 0, 0.36);
  --pro-dialog-mask-blur: 2px;
}

按需引入

import { ProDialog, setPopupZIndexBase } from '@hz_yujin/vue2-base-dialog'
import '@hz_yujin/vue2-base-dialog/style.css'

Vue CLI 3 / webpack 4

若构建报错解析现代语法,请将本包加入 transpileDependencies。

发布

pnpm --filter @hz_yujin/vue2-base-dialog publish --access public

Related Packages

@arfedulov/vue2-modal

An easy to style vue component for creating modal windows.

905 1
@hz_yujin/vue2-base-table

Vue 2 ProTable / ProPageTable:搜索、valueType、筛选、持久化、树表、行内编辑、批...

5,177
zfs-component

basic components of zfs

6,473
@fsscxh/zfs-component

basic components of zfs

3,796
vue-layerx

像路由导航一样调度弹窗,像普通组件一样复用弹窗内容

2,393 9

Version History

Version Released Vue License
0.1.5 ^2.6.14 || ^2.7.0 MIT
0.1.4 ^2.6.14 || ^2.7.0 MIT
0.1.3 ^2.6.14 || ^2.7.0 MIT
0.1.2 ^2.6.14 || ^2.7.0 MIT
0.1.1 ^2.6.14 || ^2.7.0 MIT