Vue3 如何实现一个带遮罩的 dialog 对话框(二)

简介: Vue3 如何实现一个带遮罩的 dialog 对话框

六. 神奇的 h 函数


目前我们的 dialog 已经可以出现到我们的页面了,但是现在它的内容都是写死的,不灵活,我们需要按照不同的场景传递不同的文字该如何实现呢?这里又需要请出我们的老朋友,h 函数。

h 函数是可以接收第二个参数的,并且第二个参数的值将被转换成 props 传递给我们的组件。

让我们回到 dialogCreator.ts 文件。我们声明一个类型,准备作为 DialogCreator 内部 constructor 参数的类型。这里我先抛出概念,等等我们一步一步验证。

image.png

并且声明两个类的属性 titlecontent 来准备做为 props 传递给我们的 Dialog.vue 组件。

image.png

我们现在还缺少一个关键的东西,就是取消按钮确定按钮的函数,我们一并声明。(这里需要注意,一般取消按钮就是关闭 dialog 对话框的功能,也就是类本身的 dismiss 方法,所以我们不需要用户额外提供取按钮的函数,只需要提供确定时的回调函数即可。)

1395895c3b8e49a484e05e5e88b1778a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

这里需要读者仔细品味上图代码的含义。

接下来我们就需要传递 this.optionh 函数即可。

image.png

报错了没关系,是因为我们还没有在 Dialog.vue 组件内部定义 Props

让我们分别从 dialogCreator.ts 文件导出这个 DialogPropsType 类型,再从 Dialog.vue 引入这个类型用来定义 props 即可。

image.png

随即可以看到我们刚刚到报错消失了,说明我们的思路是没问题的。

image.png

七. 改造 Dialog.vue 组件


我们先将之前固定写死的,title 部分和 content 部分替换成我们声明的 props 里的 title

image.png

然后别忘了我们 props 还存放着《确定》和《取消》的的方法。取出来分别放置在这两个按钮身上。

image.png

随便找一个其它页面,测试刚刚的 DialogCreator 类,内容我就随便自己写了

image.png

我们测试一下:

f9532e727d0e432ea1847d7a6e305bec_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

八. 遮罩的关闭效果


现在我们点击遮罩是没办法关闭 dialog 的,效果如下:

4537a8312f8a4785b9f8e9dc51a3b3a0_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

造成这种情况的原因也很简单,因为我们的遮罩没有点击事件,怎么办呢?非常非常简单,给遮罩添加取消 cancelBtn ,也就是 dismiss 方法不就可以了吗?

image.png

测试一下,现在点击遮罩已经可以正常关闭 dialog 了。

68708102f09f43b7af6c3b5cf9a7dcfc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

九. 修复冒泡造成的 Bug


目前看起来功能已经很棒了,但是目前的代码会造成一个严重的 bug,我们在点击 dialog 本身的时候,由于事件冒泡,会错误的触发遮罩层的方法。

cb0770551d6f414fa98f02a1c3c69154_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

我们验证一下,我们随便编写一个函数,然后绑定到 dialog 组件上。

image.png

注意:这里的 dialog 指的是中间的那个实实在在的对话框本身,不是指整个组件。

image.png

image.png

然后给 cancelBtn 也加一行 console.log 测试一下。

image.png

效果如下:

c7faaffaa3ca4f709d633b42ed0ae848_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

解决方法简单的出乎你的意料,让我们回到中间的 diaolog 身上,仅仅只需要绑定一个空的 click 函数,然后加上修饰符 stop 即可。

image.png

效果如下,可以看到,现在点击 dialog 已经不会错误的关闭整个 对话框了。

75c2b0668dd144669769c8b347f9e00e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg

  1. 至此我们的 dialog 组件已经可以在绝大部分场景下使用了。🎁~

总结


目前的代码只是一个很粗糙的实现,更加具体实用的功能还需读者根据自己项目的需求自行完成。下面是 DialogCreator.ts 文件的代码。读者可根据需要自行查阅。

import Dialog from "./Dialog.vue";
import { h, render } from "vue";
interface DialogType {
  title: string;
  content: string;
  confirmBtn: () => void;
}
export interface DialogPropsType extends DialogType {
  closeBtn: () => void;
}
export class DialogCreator {
  containerEl: HTMLDivElement;
  option: DialogPropsType;
  constructor(option: DialogType) {
    this.containerEl = document.createElement("div");
    this.option = { ...option, closeBtn: this.disMiss.bind(this) };
  }
  present() {
    const vnode = h(Dialog, this.option);
    render(vnode, this.containerEl);
    document.body.insertBefore(this.containerEl, document.body.firstChild);
  }
  disMiss() {
    render(null, this.containerEl);
    document.body.removeChild(this.containerEl);
  } //dialog 消失的方法
}


相关文章
|
5天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
109 64
|
5天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
|
27天前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
56 7
|
28天前
|
前端开发 数据库
芋道框架审批流如何实现(Cloud+Vue3)
芋道框架审批流如何实现(Cloud+Vue3)
47 3
|
27天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
46 1
|
27天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
49 1
|
1月前
|
前端开发 JavaScript
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
|
12天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
28 1
vue学习第四章
|
12天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
25 1
vue学习第九章(v-model)
|
12天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
27 1
vue学习第十章(组件开发)