热门标签 | 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;

推荐阅读
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文介绍了如何在 Vue 3 组合 API 中正确设置 setup() 函数的 TypeScript 类型,以避免隐式 any 类型的问题。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • Webpack 初探:Import 和 Require 的使用
    本文介绍了 Webpack 中 Import 和 Require 的基本概念和使用方法,帮助读者更好地理解和应用模块化开发。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
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社区 版权所有