热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue3.x全局toast、message、loading组件

vue3.x全局toast、message、loading组件Toast组件loadingToast组件在srccomponents下创建toast文件夹,并依此创


vue3.x全局toast、message、loading组件

    • Toast组件
    • loading


Toast组件


  • 在 src/components下创建toast文件夹,并依此创建index.vue和index.js

1、index.vue
一般toast会有如下功能:背景色、字体颜色、文本、停留时间

<template>
<div class&#61;"toast-box" ><p class&#61;"toast-value" :style&#61;"{background: background, color: color}">{{ value }}</p>
</div>
</template>
<script>import { defineComponent } from &#39;vue&#39;export default defineComponent({name: &#39;Toast&#39;,props: {value: {type: String,default: &#39;&#39;},duration: {type: Number,default: 3000},background: {type: String,default: &#39;#000&#39;},color: {type: String,default: &#39;#fff&#39;}}})
</script><style>
.toast-box {position: fixed;width: 100vw;height: 100vh;top: 0;left: 0;display: flex;align-items: center;justify-content: center;z-index: 1000;
}.toast-value {max-width: 100px;background: rgb(8, 8, 8);padding: 8px 10px;border-radius: 4px;text-align: center;display: inline-block;animation: anim 0.5s;}&#64;keyframes anim { 0% {opacity: 0;}100%{opacity:1;}}.toast-value.remove{animation: remove 0.5s;}&#64;keyframes remove { 0% {opacity: 1;}100%{opacity:0;}}
</style>

2、index.js 导出Toast方法


  • 创建
    首先使用createVNode方法创建一个vNode独享
    使用render方法转换成真实dom
    添加到body

  • 销毁
    首先添加一个淡入淡出效果
    使用render将真实设置为null
    移除创建的dom

以下代码为TS写法&#xff0c;不支持部分去掉代码即可

import { createVNode, render } from &#39;vue&#39;
import toastTemplate from &#39;./index.vue&#39;
export interface IProps {value?: string;duration?: number;background?: string;color?: string;
}
const defaultOpt &#61; { // 创建默认参数duration: 3000
}export interface ResultParams {destory?: () &#61;> void;
}
// eslint-disable-next-line &#64;typescript-eslint/explicit-module-boundary-types
const Toast &#61; (options: IProps):ResultParams &#61;> {const container &#61; document.createElement(&#39;div&#39;)const opt &#61; {...defaultOpt,...options}const vm &#61; createVNode(toastTemplate, opt) // 创建vNoderender(vm, container)document.body.appendChild(container) // 添加到body上const destory &#61; ()&#61;> {const dom &#61; vm.el as HTMLDivElementif(dom.querySelector(&#39;.toast-value&#39;)) {dom.querySelector(&#39;.toast-value&#39;)?.classList.add(&#39;remove&#39;) // 销毁时添加淡入淡出效果const t &#61; setTimeout(() &#61;> { // 淡入淡出效果之后删除dom节点render(null, container)document.body.removeChild(container)clearTimeout(t)},500);} }if(opt.duration) { // 如果传入的值为0可以持续保留在页面&#xff0c;需要手动销毁const timer &#61; setTimeout(()&#61;> {destory()clearTimeout(timer)}, opt.duration)}return {destory}
}
export default Toast

3、main.js插件全局引入

import Toast from &#39;&#64;/components/Toast/index&#39;app.config.globalProperties.$toast &#61; Toast;
// app.use(Toast) 用use来全局载入会导致我们不能使用this的地方不太好调用。

4、使用

this.$toast({value: &#39;toast&#39;,duration: 0, // 如果大于0则不必使用destory方法background: &#39;#000&#39;,color: &#39;#fff&#39;
})
setTimeout(() &#61;> {this.$toast.destory && this.$toast.destory()
}, 2000)

setup内使用

import { getCurrentInstance} from &#39;vue&#39;setup() {const { proxy } &#61; getCurrentInstance();const showToastEvent &#61; () &#61;> {proxy.$toast({value: &#39;toast&#39;,duration: 1000,background: &#39;#000&#39;,color: &#39;#fff&#39;})}return {showToastEvent,}
}

loading

<template><div class&#61;"loading">加载中...</div>
</template><script>export default {name: "loading",}
</script><style scoped>.loading {position: fixed;left: 50%;top: 50%;background-color: rgba(0, 0, 0, 0.2);color: white;transform: translate(-50%, -50%);border-radius: 4px;padding: 8px 10px;z-index: 1000;}
</style>

import { createApp } from "vue"import Loading from &#39;./loading.vue&#39;export default {instance: null,parent: null,times: 0, // 为了保证多个同时loading的时候&#xff0c;只显示一个&#xff0c;并且需要全部close之后才消失open() {if (this.times &#61;&#61; 0) {this.instance &#61; createApp(Loading)this.parent &#61; document.createElement("div")let appDom &#61; document.getElementById(&#39;app&#39;)appDom.appendChild(this.parent)this.instance.mount(this.parent)}this.times &#43;&#43;},close() {this.times --if (this.times <&#61; 0) {this.times &#61; 0let appDom &#61; document.getElementById(&#39;app&#39;)this.instance.unmount(this.parent)appDom.removeChild(this.parent)}}
};

import loading from &#39;&#64;/components/loading/index&#39;
app.config.globalProperties.$loading &#61; loading;

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有