# useDialog 函数式调用文档
useDialog 是一个函数式调用的对话框工具,基于 Element UI 的 el-dialog 组件封装,提供了更灵活、更简洁的对话框创建方式。
# 功能特性
- ✅ 函数式调用,无需在模板中声明组件
- ✅ 支持自定义组件内容
- ✅ 支持传递组件属性
- ✅ 支持自定义对话框配置
- ✅ 支持关闭回调
- ✅ 支持拖拽功能
# 基本用法
# 表单对话框
# 使用 H 函数
# 异步加载组件
# 标题插槽示例
# useDialog(options)
# 参数
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
|---|---|---|---|---|
componentInstance | 要在对话框中显示的组件实例 | Object/Function | - | 必需 |
componentProps | 传递给组件的属性 | Object | {} | - |
dialogProps | 传递给 el-dialog 的属性 | Object | 见下文 | - |
titleSlot | 自定义标题插槽,支持函数或组件对象 | Function/Object | null | - |
target | 对话框挂载的目标元素 | HTMLElement | document.body | - |
close | 关闭回调函数 | Function | - | - |
# dialogProps 默认值
{
modal: false,
top: "0",
closeOnClickModal: false,
closeOnPressEscape: false,
}
# close 回调函数参数
| 参数 | 说明 | 类型 |
|---|---|---|
type | 关闭类型,_close 表示点击 X 或遮罩层关闭 | String |
componentRef | 对话框中组件的实例引用 | Object |
close | 关闭对话框的函数 | Function |
# 返回值
返回一个 DialogInstance 实例,包含以下方法:
| 方法 | 说明 | 参数 |
|---|---|---|
close() | 关闭对话框 | - |
# 关闭对话框
# 1. 通过组件内部触发
在对话框内的组件中,通过 $emit('close', type) 触发关闭:
// 在组件内部
this.$emit('close', 'confirm'); // 传递关闭类型
# 2. 通过 close 回调函数
在 close 回调函数中,调用 close() 方法关闭:
close: (type, componentRef, done) => {
// 处理逻辑
done(); // 调用 done 方法关闭对话框
};
# 3. 通过对话框实例
保存对话框实例,后续可以通过实例调用 close() 方法:
// 打开对话框并保存实例
const dialogInstance = useDialog(options);
// 后续需要关闭时
setTimeout(() => {
dialogInstance.close();
}, 3000);
# 注意事项
组件引用:通过
close回调函数的componentRef参数可以获取对话框中组件的实例,用于访问组件的方法和数据对话框配置:
dialogProps支持 Element UIel-dialog组件的所有属性,详细配置请参考 Element UI 文档 (opens new window)拖拽功能:对话框默认支持拖拽,通过
v-dragDialog指令实现性能优化:对话框关闭后会自动销毁组件实例并从 DOM 中移除,无需手动清理
# 常见问题
# Q: 如何在对话框中使用异步操作?
A: 可以在组件内部使用异步操作,完成后通过 $emit('close', type) 触发关闭:
// 在组件内部
async handleSubmit() {
try {
await this.$axios.post('/api/submit', this.form);
this.$emit('close', 'success');
} catch (error) {
this.$emit('close', 'error', error);
}
}
# Q: 如何自定义对话框的样式?
A: 可以通过 dialogProps 传递 customClass 属性,然后在 CSS 中定义样式:
const dialogInstance = useDialog({
// ...
dialogProps: {
title: '自定义样式对话框',
customClass: 'my-dialog',
},
});
/* 自定义对话框样式 */
.my-dialog {
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}