Skip to content

打开与关闭

有了组合式函数(如 useDialog)和内容组件之后,先创建弹层实例,再 open / close

创建实例

vue
<script setup lang="ts">
import HelloWorld from './HelloWorld.vue'
import { useDialog } from './dialog'

const dialog = useDialog(HelloWorld)
</script>

<template>
  <button @click="dialog.open()">打开</button>
  <button @click="dialog.close()">关闭</button>
</template>

向内容传参

打开时传入(最常用)

ts
dialog.open({ props: { id: 1, mode: 'edit' } })

这里顶层的 props 交给内容组件idmode 等)。

创建实例时写默认

每次打开都要带的参数,可以写在 useDialog 的第二参,少在 open 里重复:

ts
const dialog = useDialog(HelloWorld, {
  props: { mode: 'edit' },
})

dialog.open({ props: { id: 1 } })

顶层 props 指哪一侧

配置里经常出现顶层 props,含义取决于写在哪:

写在哪里顶层 props 给谁
createLayer 第二参容器titlewidth
useDialog / open内容idmode

若在 open 时既要给内容传参、又要改容器标题,内容用顶层 props,容器写到 container 里:

ts
dialog.open({
  props: { id: 1 },
  container: { props: { title: '当次标题' } },
})

(内容组件里也可以用 defineLayer 声明容器默认标题,见下一章。)

常用实例能力

成员说明
open(config?)打开弹层
close()关闭弹层
visible是否打开(只读 getter,直接读 dialog.visible

cloneconfirm、模块单例等见 实例的更多能力

可以不传内容组件

useDialog() 允许省略内容组件——仍是「有容器、无内容」;改标题、宽度请走 container:(顶层 props 默认指内容,没有内容时没有落点)。这和「Dialog + 表单还粘在一个文件里」不是一类问题,建模对比见 容器与内容未拆分

下一步

在内容组件里配置弹层

MIT Licensed