Vue3 实现一个自定义toast(小弹窗)

前言:

前两天在项目中很多场景下都需要用到一个toast弹窗,项目使用的是ionic+tialwind_Css,ionic也有自带的toast弹窗,虽然大部分场景下直接调用它提供的api已经能满足需求了,但是它弹窗的高度,(也就是弹窗出现的位置)并不是高度自定义的,并且弹窗的z-index在我们项目中会和一些组件冲突,但是这个之前一直没有办法解决,所以干脆自己手写了一个使用方法高度类似ionic_Toast的组件。

这个组件也是我第一次在vue3下实现的,也查阅了很多网上相关的文章,也受到很多启发灵感,所以自己吸取精华去其糟粕来完成了一版个人感觉使用起来很方便的一个版本,特来记录一下实现的过程,希望可以帮助到遇到同样迷惑的人。

tips:(本篇文章不会上手就教你样式怎么写,代码怎么写,而是会帮你逐渐一步步理解相关额外的知识。会以“假如我是一个初学者,如果当时有人这样告诉我的话,我就大概能听明白”的角度去解释。所以篇幅较长,如果想直接看组件的实现,可直接跳转到标题三)

在这里祝大家中秋节快乐呀~~

Vue3 实现一个自定义toast(小弹窗)_第1张图片

下面是正文:


一. 前置任务:JSX和渲染函数的概念

  1. 想要完成这个需求,你需要了解一下标题的那两个概念。官方文档在这里,里面的话语太过于“专业和官方”,导致我刚开始看的时候非常迷惑,所以在这里我会帮你去理解里面的一些很官方的言语,让你快速有个认知。

原地址在这里:vue官方文档JSX和渲染函数。

  1. 我们暂且还不需要去深入理解渲染机制的整个流程。所以官方下面个链接暂且不要去查阅,会让你越来越头晕。 但在这里我要说明一点,接下来讲的内容都是建立在我默认你对虚拟DOM的概念有一定的了解。

Vue3 实现一个自定义toast(小弹窗)_第2张图片

  1. 紧接就写到了Vue为我们提供了一个函数,来创建vnodes。在阅读这个页面的时候,一定注意官方在每个代码右上角的文件类型。

Vue3 实现一个自定义toast(小弹窗)_第3张图片

  1. 这里需要插个必须要了解的题外话,了解React的同学一定知道JSX这种写法

Vue3 实现一个自定义toast(小弹窗)_第4张图片

Vue里JSX的概念和React的JSX的概念是极其相似的。Vue也是借鉴了React的这个思想,这里我们重点看画线的这句话。(不熟悉react的小伙伴也不要担心,本文实现的Toast并没有使用到JSX和babel。)

Vue3 实现一个自定义toast(小弹窗)_第5张图片

是不是觉得和刚刚Vue官方写的很相似?

Vue3 实现一个自定义toast(小弹窗)_第6张图片

官方在上文也提到了h是什么。如果我们把h换成createVnode(),是不是就和React.createElement的用法及其相似了呢?

Vue3 实现一个自定义toast(小弹窗)_第7张图片

  1. 其实不管是Vue的h(),还是React.createElement() 它们最终要达到的目的只有一个:创建虚拟DOM。而这也对应了Vue中createVnode的Vnode其实就是virtual node的意思。函数名的直接翻译其实也就是创建虚拟节点。而JSX只是创建虚拟dom的语法题而已,仅此而已,并没有什么特别之处。

二. createVnode函数的意义

  1. 现在我们在 .Vue文件写如下代码。

Vue3 实现一个自定义toast(小弹窗)_第8张图片

非常简单的结构,一个id是"hanzhenfang"的div标签,标签内容是我的名字。ok,这样写的话,vue就会帮我们将这个结构转换为虚拟dom。 本质上是使用了

 
  
 
  

h("div",{id:"hanzhenfang"},"韩振方")

h()可以有多个参数,

这段代码是在