做好了 Button,知道有遮罩层这么一回事,就可以做 Dialog 组件了
需求分析
惯例先行需求分析
- 默认是不可见的,在用户触发某个动作后变为可见
- 自带白板卡片,分为上中下三个区域,分别放置标题、内容、操作
- 有两个基本操作:确定、取消
- 卡片后应放置淡黑色遮罩层,遮住原本网页内容
- 可以自定义是否允许取消
- 右上角提供小叉叉来允许关闭
- 允许通过点击遮罩层来关闭
那么可以整理出以下参数表格
参数 | 含义 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
visible | 是否可见 | boolean | false / true | false |
title | 标题 | string | 任意字符串 | 必填 |
ok | 确定回调 | ()=>boolean | 返回 boolean 的函数 | ()=>true |
cancel | 取消回调 | ()=>boolean | 返回 boolean 的函数 | ()=>true |
第 3 条,可以通过设置返回值为 true 来允许事件发生,反之不允许
第 5 条,可以通过设置返回 false 来取消事件
第 6/7 条,直接与取消功能共用函数即可
骨架
可以复用已经制作好的 Button
组件
容易得到如下骨架
1 | <template> |
但是我们一般不希望对话框弹窗在 DOM 树上的位置是非常下级的元素的子元素,而希望是 body
的直接子元素,那么我们可以使用 vue3 的 teleport
组件
1 | <template> |
这样,在渲染时,teleport
内部的内容就会出现在 body
的子级
功能
先 ts 声明
1 | declare const props: { |
然后在 export default
中,写入我们的参数
1 | export default { |
再补全 setup
方法,此处选用 Promise 制造提交等待响应的感觉
1 | setup(props, context) { |
样式表
然后补全样式表
1 | .laby-dialog-overlay { |
测试
引入文档页看一下
1 | // src/components/Dialog.vue |
效果如图
一行代码打开
有时候还会想,能不能不用组件式,直接用函数生成一个呢
其实是可以的,只要使用 vue3 提供的 createApp
和 h
函数就可以做到了
此处只给出一个示例,不多介绍
1 | // createDialog.ts |
在需要的地方使用
1 | import {createDialog} from './createDialog.ts' |
引入即可
该函数要求传入一个 options
对象,该对象包含 title, content, ok, cancel
等 4 个部分,content
指代组件式中的插槽,其余含义见需求分析
然后使用 h
函数渲染新 app 中的内容,并作为参数传入 createApp
函数用以创建新的 app,最后挂载到 DOM 树上即可
感谢阅读