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

  • Toast组件
  • loading

Toast组件

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

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

<template>
<div class="toast-box" ><p class="toast-value" :style="{background: background, color: color}">{{ value }}</p>
</div>
</template>
<script>import { defineComponent } from 'vue'export default defineComponent({name: 'Toast',props: {value: {type: String,default: ''},duration: {type: Number,default: 3000},background: {type: String,default: '#000'},color: {type: String,default: '#fff'}}})
</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;}@keyframes anim { 0% {opacity: 0;}100%{opacity:1;}}.toast-value.remove{animation: remove 0.5s;}@keyframes remove { 0% {opacity: 1;}100%{opacity:0;}}
</style>

2、index.js 导出Toast方法

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

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

以下代码为TS写法,不支持部分去掉代码即可

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

3、main.js插件全局引入

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

4、使用

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

setup内使用

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

loading

<template><div class="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 './loading.vue'export default {instance: null,parent: null,times: 0, // 为了保证多个同时loading的时候,只显示一个,并且需要全部close之后才消失open() {if (this.times == 0) {this.instance = createApp(Loading)this.parent = document.createElement("div")let appDom = document.getElementById('app')appDom.appendChild(this.parent)this.instance.mount(this.parent)}this.times ++},close() {this.times --if (this.times <= 0) {this.times = 0let appDom = document.getElementById('app')this.instance.unmount(this.parent)appDom.removeChild(this.parent)}}
};
import loading from '@/components/loading/index'
app.config.globalProperties.$loading = loading;

vue3.x全局toast、message、loading组件相关推荐

  1. React Native封装Toast与加载Loading组件

    React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...

  2. Flutter EasyLoading - 让全局Toast/Loading更简单

    ✨flutter_easyloading: 一个简单易用的Flutter插件,包含23种loading动画效果.进度条展示.Toast展示.纯Flutter端实现,支持iOS.Android. ✨开源 ...

  3. react如何控制全局loading_ReactJS实践(一)—— FrozenUI React化之Loading组件

    在前面我们通过四篇文章入门了React的大部分主要API,现在则开始进入实践环节. 实践系列的开篇打算拿我司的FrozenUI来试验,将其部分UI组件进行React化,作为第一篇实践文章,将以较简单的 ...

  4. react如何控制全局loading_React Loading组件的正确姿势

    React Loading组件的正确姿势 页面异步加载的时候为缓解用户等待的焦虑情绪,我们通常会采取加载中...等文字或图标提示. (图例,各种加载中状态) 日常写法 直接在state中存一个load ...

  5. element-ui clearable 不显示_从ElementUI的loading组件说起

    原文地址: 从ElementUI的loading组件说起​alfxjx.github.io 前言 最近发现自己的主页首屏加载很慢,于是想用一个loading组件掩饰一下,这一下就来到了知识的荒原,对插 ...

  6. 最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评

    本文完整版:<最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评> Vue 实时消息提示通知 Vue-notification - 专注实 ...

  7. Vue 2.x折腾记 - (15) 捣鼓一个中规中矩loading组件

    前言 最近有一个新的项目,UI大佬不知道从哪里找来了一张GIF丢到蓝湖, 说作为全局的页面loading ,但是自己想了想,还是选择画一个. 一开始想过用svg,canvas,最终还是选择了css3+ ...

  8. Vue3项目 —— Vite / Webpack 批量注册组件

    勇者愤怒,抽刃向更强者:怯者愤怒,却抽刃向更弱者. 人生的许多大困难,只要活着,没有什么是解决不了的,时间和智慧而已. 前期回顾      Vue3 中 reactive 和 ref 和 toRefs ...

  9. vue 项目中使用 Loading 组件

    当在vue项目中请求后台接口时,常常会使用 loding 过渡数据的加载时间. 如果 loading 作为一个全局的加载状态,应该写在项目中的App.vue中 <template>< ...

最新文章

  1. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)
  2. python分类预测降低准确率_python实现吴恩达机器学习练习3(多元分类器和神经网络)...
  3. (32)FPGA面试技能提升篇(EMMC)
  4. java线程条件变量_Java线程:条件变量 lock
  5. 单机html游戏修改数据,星露谷物语存档修改图文教程 怎么修改游戏数据
  6. 应急指挥中心建设方案
  7. 华为Push最新版接入(Mac)
  8. 机器学习 扬帆起航004-02评估假设与比较检验
  9. 网站建设就是要大胆创新
  10. hdu 校赛 油菜花王国
  11. 一个DataFrame赋值的诡异报错 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc
  12. 机器学习笔记-多分类学习,类别不平衡,决策树
  13. win10亮度怎么调_笔记本屏幕亮度怎么调
  14. 【技术分享】Windows10下安装Nvidia显卡驱动及cuda和cudnn
  15. 相片尺寸规格像素一览
  16. 如何优雅的完成一场说来就来的APP自建
  17. 乐观锁和悲观锁的简单实现
  18. 中控门禁无法添加设备,提示表结构不存在或接收超时
  19. 运行slmgr.vbs -xpr, 找不到应用程序
  20. Linux下文件夹的移动与复制

热门文章

  1. Openfire3.9.3源代码导入eclipse中开发配置指南(转载)
  2. [家里蹲大学数学杂志]第041期中山大学数计学院 2008 级数学与应用数学专业《泛函分析》期末考试试题 A...
  3. 使用AIR运行另外的程序。
  4. 机器学习 客户流失_通过机器学习预测流失
  5. leetcode1328. 破坏回文串
  6. leetcode46. 全排列(回溯)
  7. leetcode632. 最小区间(堆+多指针)
  8. aws 静态网站_如何使用AWS托管静态网站-入门指南
  9. Go语言-基本的http请求操作
  10. Linq常用List操作总结,ForEach、分页、交并集、去重、SelectMany等