vue实现消息提示框

2023-10-30

我们常常看到很多vue生态下的ui框架的消息提示框,在页面切换的时候依然停留在页面,我们知道vue这种单页面渐进式框架,所有的操作和元素都是挂载在一个节点上的,当路由变化是整个节点下的dom元素也在重新渲染,若要实现ui框架中的类似的消息提示框的话,理论上就该把这样的组件挂载到其他的节点上,这样就互不影响了。vue已经为我们考虑好了,在vue上提供了一个vue.extend()函数,可以创建一个“子类”。可查看Vue官方API

首先你得有一个消息提示框组件,我这里创建了一个VNotify组件。

<template>
  <div
    v-if="options.show"
    class="v-notify animated"
    :class="[options.type, options.hide ? 'fadeOutRight' : 'fadeInRight']">
    <h3 v-if="options.title" class="title">{{ options.title }}</h3>
    <div class="content">{{ options.message }}</div>
  </div>
</template>

<script>
import { reactive, onBeforeUnmount } from 'vue'

export default {
  name: 'VNotify',
  setup(props, ctx) {
    const options = reactive({
      type: '',
      show: false,
      hide: false, // 消失动画判断
      timeout: 3000
    })
    const init = (params) => {
      options.show = true
      options.title = params.title
      options.type = params.type
      options.message = params.message
      autoDestory()
    }
    // 自动销毁
    let timer
    let innerTimer
    const autoDestory = (timeout) => {
      timer = setTimeout(() => {
        options.hide = true
        innerTimer = setTimeout(() => {
          options.show = false
          options.hide = false
          clearTimeout(timer)
          clearTimeout(innerTimer)
        }, 400) // 动画时间
      }, options.timeout + 400)
    }
    onBeforeUnmount(() => {
      options.type = ''
      options.show = false
      options.hide = false
      clearTimeout(timer)
      clearTimeout(innerTimer)
    })
    return {
      options,
      init
    }
  }
}
</script>

<style lang="scss" scoped>
.v-notify {
  position: fixed;
  right: 12px;
  top: 24px;
  z-index: 999;
  padding: 12px;
  min-width: 296px;
  min-height: 146px;
  background-color: #fff;
  border: 2px solid transparent;
  box-shadow: 0 0 5px rgba($color: #000000, $alpha: 0.2);
  border-radius: 6px;
  overflow: hidden;
  animation-duration: 0.4s;
  .title {
    line-height: 44px;
    border-bottom: 1px solid rgba($color: #000, $alpha: 0.1);
    margin-bottom: 12px;
  }
  .content {
    line-height: 24px;
  }
}
.v-notify.success {
  border-color: $theme-color;
  .title {
    border-bottom-color: $theme-color;
  }
}
.v-notify.danger {
  border-color: $danger-color;
  .title {
    border-bottom-color: $danger-color;
  }
}
.v-notify.warning {
  border-color: $warning-color;
  .title {
    border-bottom-color: $warning-color;
  }
}
</style>

然后写一个js文件,在入口文件处引用,将组件挂载到body上。下面代码中我是用了一个类封装起来这是为了可以将使用此逻辑实现dialog,message等组件。也可以给子类继承,实现可以同事创建多个提示框。这里给出部分代码,功能根据需求扩展。其中的process.client这个是因为,在这个项目中使用了服务端渲染技术,保证能获取到body元素。若非服务端项目,直接挂在即可。

import Vue from 'vue'
import VNotify from '@/components/global/VNotify'

class InstallDialog {
  // 创建提示信息框
  static CreateNotify(v) {
    const NotifyConstructor = v.extend(VNotify)
    // 创建一个 #_nuxt实例外的VNotify实例并挂载document上
    const NotifyInstance = new NotifyConstructor().$mount() 
    v.prototype.$notify = (params) => {
      document.body.appendChild(NotifyInstance.$el) // 将组件根节点作为挂在的dom
      NotifyInstance.init(params) // 这里执行的组件提供的init函数
      return NotifyInstance
    }
  }
}
if (process.client) {
  Vue.use(InstallDialog.CreateNotify)
}

看看如何使用。

<template>
  <div id="vue-page" class="container">
    <button class="button--green" @click="showMessage">Open</button>
  </div>
</template>

<script>
export default {
  name: 'VuePage',
  setup(props, ctx) {
    const { root } = ctx
    const showMessage = () => {
      root.$notify({ // 直接调取我们挂在上的函数就能执行了
        type: 'success',
        title: 'Test title',
        message: 'Test message'
      })
    }
    return {
      showMessage
    }
  }
}
</script>

效果图。
效果图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue实现消息提示框 的相关文章

随机推荐

  • ES(Elasticsearch)中文检索使用笔记(一)

    1 什么是Elasticsearch 根据官网介绍 https www elastic co cn elasticsearch Elasticsearch 以下简称为ES 主要是一种基于JSON的分布式 高扩展 高实时的搜索与数据分析引擎
  • Qt之页面布局

    QTlayout概述 Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件 确保它们有效地使用空间 Qt包含了一组布局管理类 从而在应用程序的用户界面中对部件进行布局 比如QLayout的几个子类 这里将它们称作布局管理器 所有QW
  • 基于SSM+JSP的学生信息管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 34-鼠标拖拽文件功能

    鼠标拖拽文件功能 直接拖动部分文件或者文件夹到tkinter窗口 实现快速添加文件功能 需要安装windnd库 demo如下 import tkinter as tk import windnd from tkinter messagebo
  • 数据库中系统数据库服务器,sql中什么是系统数据库服务器

    sql中什么是系统数据库服务器 内容精选 换一换 数据复制服务 Data Replication Service 简称DRS 是一种易用 稳定 高效 用于数据库实时迁移和数据库实时同步的云服务 数据复制服务围绕云数据库 降低了数据库之间数据
  • 【C语言】一篇博客带你弄懂最大公约数和最小公倍数

    目录 前言 什么是最大公约数和最小公倍数 最大公约数与最小公倍数的公式 求最大公约数方法 方法一 暴力穷举法 方法二 辗转相除法 方法三 更相减损术 求最小公倍数的方法 方法一 公式法 方法二 暴力穷举法 方法三 叠乘法 最后总结 前言 我
  • go语言基础-----23-----文件解析器goconfig

    1 文件解析器goconfig go的ini配置文件非常简单 看下面代码即可 运行之前需要go get go get github com Unknwon goconfig package main import fmt log githu
  • 基于Unittest框架写的自动化脚本右键运行出现 run “py.test for ...“的解决办法

    一 看图 python脚本都是 unittest 写的 但是 运行的时候没注意是 py test 就运行了 二 网上找了解决办法 说是要修改默认运行方式 进入 File Settings Tools Python Integrated To
  • Git:更改远程仓库指向(五)

    修改已有git仓库的远程仓库指向 git remote set url origin 仓库地址 git remote set url origin git github com test thinkphp git Tips 小程序云开发 中
  • SpringBoot项目部署

    Springboot项目部署有两种方式 分别为 打包为jar war jar包和war包到部署服务器的区别和优缺点 1 部署war包 1 将war包解压 将里面的内容放到服务器项目的目录下 2 重启服务器 启动tomcat的时间会有些长 约
  • QNX系统BSP开发研发与应用,QNX技术解答-项目开发-软件开发

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 目前总结了一些
  • [LeetCode-27]-Remove Element (删除指定元素)

    文章目录 题目相关 Solution 题目相关 题目解读 使用In place 原地算法 从数组中删除指定值的所有元素 并返回删除后的数组长度 原题描述 原题链接 Given an array nums and a value val re
  • python函数式编程——迭代器(2)

    文章目录 前言 一 迭代器 前言 python学习笔记 仅供学习使用 一 迭代器 迭代是访问集合元素的 种 式 迭代器是 个可以记住遍历的位置的对象 迭代器对象从集合的第 个元素开始 访问 直到所有的元素被访问完结束 迭代器只能往前不会后退
  • java 静态变量 静态代码初始化块 构造函数的顺序

    静态变量或静态代码块 先后与代码书写顺序有关 初始化代码块或普通变量 顺序与代码书写顺序有关 构造函数 几大原则 一 静态成员变量 Static 1 静态成员变量为类变量 所有对象共享同一内存空间 2 静态成员变量的声明和定义仅在首次加载类
  • 视频无损放大软件:Topaz Video Enhance AI Mac版(支持m1)

    Topaz Video Enhance AI for Mac是一款专业的AI视频无损放大软件 topaz video enhance ai mac版使用时间信息有效提高视频质量和细节 从而达到最好的视频放大 去隔行 降噪和还原效果 另外to
  • gitlab目录功能结构

    默认安装的gitlab 主要有四个目录 opt gitlab 主目录 etc gitlab 放置配置文件 var opt gitlab 各个组件 var log gitlab 放置日志文件 功能操作 检查gitlab各组件状态 gitlab
  • 浅议代码安全检测

    2017年6月1日 中华人民共和国网络安全法 正式实施 等级保护工作正式入法 等级保护制度已成为新时期国家网络安全的基本国策和基本制度 2019年12月1日 网络安全等级保护条例 正式实施 等保2 0是从 信息安全等级保护制度 到 网络安全
  • 卸载vs2010亲测的一个方法

    最近想把vs2010卸载掉 把方法记录下 供需要的人参考 采用的方法是vs自带的卸载的方法 步骤如下 1 打开 控制面板 点击 卸载程序 在弹出的窗口里面找到vs2010的主程序 如图 2 双击打开后 或是右键弹出 卸载 更改 菜单 进入维
  • windows10环境下用anaconda和VScode配置

    文件下载 最新的Anaconda3 5 1 0 Windows x 64 exe版本中在安装的时候已经打包好了vscode 就是在anaconda3安装完成之后 会提示你是否要安装vscode 然后勾选就可以完成vscode的安装 Anac
  • vue实现消息提示框

    我们常常看到很多vue生态下的ui框架的消息提示框 在页面切换的时候依然停留在页面 我们知道vue这种单页面渐进式框架 所有的操作和元素都是挂载在一个节点上的 当路由变化是整个节点下的dom元素也在重新渲染 若要实现ui框架中的类似的消息提