AvueAvue
首页
  • 开发指南
  • Skill开发
  • 在线测试工具
  • Form组件
  • Crud组件
  • Default组件
  • Data组件
  • Component组件
产品
工作台
授权
联系
2.x文档
个人支付接口
首页
  • 开发指南
  • Skill开发
  • 在线测试工具
  • Form组件
  • Crud组件
  • Default组件
  • Data组件
  • Component组件
产品
工作台
授权
联系
2.x文档
个人支付接口
  • Article 文章
  • Group 分组容器
  • Title 标题文本
  • CountUp 数字动画
  • Comment 评论
  • Chat 客服聊天
  • Captcha 验证码
  • Contextmenu 右键菜单
  • Clipboard 复制文本
  • DialogForm 弹窗表单
  • Draggable 拖拽
  • Export Excel 导入与导出
  • Flow 流程
  • FilterBuilder 高级筛选
  • FileManager 文件管理
  • QRCode 二维码
  • Iframe 嵌入页面
  • ImagePreview 图片预览
  • Login 登录组件
  • License 授权书
  • Print 打印
  • Screenshot 页面截图
  • Search 标签搜索
  • Sign 电子签名
  • TextEllipsis 超出文本省略
  • Tabs 选项卡
  • Tree 树型
  • Video 摄像头
  • Calendar 日历组合示例

DialogForm 弹窗表单

通过 $DialogForm(appContext)(options) 打开独立 Form,支持弹窗和抽屉。应用安装后也可使用已绑定上下文的 this.$DialogForm(options)。

效果预览可直接操作下方示例

分别打开空表单、带数据表单和抽屉。姓名必填;提交后下方展示保存结果,关闭时保留结果。

正在加载示例…
<template>
  <div class="dialog-demo">
    <div class="dialog-demo__actions">
      <el-button type="primary" @click="open()">弹窗表单</el-button>
      <el-button @click="open('drawer')">抽屉表单</el-button>
      <el-button @click="open('dialog', { name: '张三', age: 28 })">带数据表单</el-button>
    </div>
    <p aria-live="polite">{{ message }}</p>
    <pre>{{ result }}</pre>
  </div>
</template>

<script setup>
import { getCurrentInstance, onBeforeUnmount, ref } from 'vue'
import { $DialogForm } from '@smallwei/avue'
const { appContext } = getCurrentInstance()
const showDialog = $DialogForm(appContext)
const result = ref('提交后显示保存结果')
const message = ref('请选择一种打开方式')
let dialog
const option = {
  submitText: '保存', span: 24,
  column: [
    { label: '姓名', prop: 'name', rules: [{ required: true, message: '请输入姓名', trigger: 'blur' }] },
    { label: '年龄', prop: 'age', type: 'number', min: 0, max: 120 }
  ]
}
function open(type = 'dialog', data = { name: '', age: 18 }) {
  dialog?.close()
  dialog = showDialog({
    title: '人员登记', width: 'min(520px, 92vw)', type, data: { ...data }, option,
    beforeClose(close) { message.value = '表单已关闭'; close() },
    callback({ data, done, close }) {
      result.value = JSON.stringify(data, null, 2)
      done()
      close()
      dialog = undefined
    }
  })
  message.value = '表单已打开'
}
onBeforeUnmount(() => dialog?.close())
</script>

<style scoped>
.dialog-demo__actions { display: flex; flex-wrap: wrap; gap: 8px; }
.dialog-demo__actions .el-button { margin-left: 0; }
pre { padding: 16px; overflow: auto; background: var(--el-fill-color-light); border-radius: 8px; font-size: 13px; line-height: 1.6; }
</style>
参数说明
data初始值对象,字段名对应 option.column[].prop
optionForm 配置,按钮文字和校验规则同样放在这里
title / width标题 / 尺寸,抽屉也通过 width 指定尺寸
typedrawer 为抽屉,其他值使用 Dialog
menuPosition底部按钮位置,默认 center
appendTo容器 CSS 选择器,默认挂载到 body
callback({ data, done, close })校验通过后回调;done 结束 loading,close 进入关闭流程
beforeClose(close)关闭前处理,需要真正关闭时调用 close

工厂返回实例的 close() 会直接销毁弹窗,适合组件卸载时清理;它与回调提供的 close() 不同,不执行 beforeClose。不要再次调用工厂来“获取”已打开的实例,那会创建新弹窗。

异步保存应成功后关闭,失败时显示错误并保留输入,最后调用 done()。完整调用与类型见全局 API。

最后更新:
贡献者: smallwei
Prev
Clipboard 复制文本
Next
Draggable 拖拽