首页 > 其他分享 >Vue开发者必备!手把手教你实现类似Element Plus的全局提示组件!

Vue开发者必备!手把手教你实现类似Element Plus的全局提示组件!

时间:2024-01-02 15:02:47浏览次数:29  
标签:Vue text Element Plus 组件 message 弹框 type div

前言

在Web开发中,用户体验至关重要。有效的信息提示和错误消息对于确保用户更好地理解和操作至关重要。在这个背景下,全局弹框提示组件成为了一个非常有用的工具。Vue.js,作为当前最受欢迎的前端框架之一,为创建灵活、可复用的弹框组件提供了强大的支持。本文将介绍一个简单而强大的全局弹框提示组件,并探讨它是如何实现的。

组件示例

Vue开发者必备!手把手教你实现类似Element Plus的全局提示组件!_xml

Vue开发者必备!手把手教你实现类似Element Plus的全局提示组件!_xml_02

Vue开发者必备!手把手教你实现类似Element Plus的全局提示组件!_Vue_03

代码展示

Message.vue

首先,让我们看看这个全局弹框提示组件的Vue文件。

// Message.vue
<template>
  <div class="message" v-if="visible">
    <img :src="imgSrc" />
    <span class="text">{{ text }}</span>
  </div>
</template>
<script setup lang="ts">
  import { onMounted, PropType, ref } from 'vue';
  const props = defineProps({
    text: {
      type: String,
      default: '',
    },
    type: {
      type: String as PropType<'warn' | 'error' | 'success'>,
      default: 'warn',
    },
  });
  const visible = ref(false);
  const imgSrc = ref('@/assets/img/warn.svg');
  onMounted(() => {
    switch (props.type) {
      case 'warn':
        imgSrc.value = require('@/assets/img/warn.svg');
        break;
      case 'error':
        imgSrc.value = require('@/assets/img/error.svg');
        break;
      case 'success':
        imgSrc.value = require('@/assets/img/success.svg');
        break;
      default:
        break;
    }
    console.log(imgSrc.value);
    visible.value = true;
  });
</script>
<style>
  .message {
    position: fixed;
    z-index: 88888;
    top: 0;
    color: black;
    left: 50%;
    height: 40px;
    line-height: 40px;
    top: 80px;
    transform: translate(-50%);
    padding: 12px;
    background-color: white;
    border: 1px solid rgba(0, 0, 0, 0.1);
    display: flex;
    align-items: center;
    animation: downed 100ms ease;
    border-radius: 4px;
    box-sizing: border-box;
  }
  @keyframes downed {
    0% {
      top: 60px;
    }
    100% {
      top: 80px;
    }
  }
  .text {
    margin-left: 5px;
    max-width: 400px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
</style>

整个组件的作用是,根据传入的 text 和 type 显示一个带有图片和文本的弹框。其中 type 有三个可能的值:warn、error 和 success,分别表示警告、错误和成功。根据 type 的值,弹框的图片和文本也会有所不同。组件使用了 Vue.js 的响应式系统,使 visible、text 和 imgSrc 成为响应式引用,从而方便地与父组件共享数据。

config.ts

有两种配置方式,根据个人爱好选择即可

第一种
// 实现使用函数调用message组件的逻辑
//   引入 创建虚拟节点 和渲染方法
import { createVNode, render } from 'vue';
// 引入信息提示组件
import message from './Message.vue';

// 准备dom容器
const div = document.createElement('div');
// 添加类名
div.setAttribute('class', 'message-container');
// 添加到body上
document.body.appendChild(div);

// 定时器标识
let timer = null;

export default ({ type, text }) => {
  const divs: any = document.getElementsByClassName('message');
  if (divs.length > 0) {
    clearTimeout(timer);
    render(null, div);
  }
  // 创建虚拟节点   第一个参数为要创建的虚拟节点  第二个参数为props的参数
  const vNode = createVNode(message, { type, text });
  // 把虚拟节点渲染DOM容器中
  render(vNode, div);
  // 开启定时器,移出DOM容器内容
  clearTimeout(timer);
  timer = setTimeout(() => {
    render(null, div);
  }, 3000);
};


第二种
// 实现使用函数调用message组件的逻辑
//   引入 创建虚拟节点 和渲染方法
import { createVNode, render } from 'vue';
// 引入信息提示组件
import message from './Message.vue';

// 准备dom容器
const div = document.createElement('div');
// 添加类名
div.setAttribute('class', 'message-container');
// 添加到body上
document.body.appendChild(div);

// 定时器标识
let timer = null;

function sendInfo(type, text) {
  const divs: any = document.getElementsByClassName('message');
  if (divs.length > 0) {
    clearTimeout(timer);
    render(null, div);
  }
  // 创建虚拟节点   第一个参数为要创建的虚拟节点  第二个参数为props的参数
  const vNode = createVNode(message, { type, text });
  // 把虚拟节点渲染DOM容器中
  render(vNode, div);
  // 开启定时器,移出DOM容器内容
  clearTimeout(timer);
  timer = setTimeout(() => {
    render(null, div);
  }, 3000);
}
export default {
  success(text) {
    sendInfo('success', text);
  },
  warn(text) {
    sendInfo('warn', text);
  },
  error(text) {
    sendInfo('error', text);
  },
};

第一种方法,我们创建了一个函数message,该函数接受type和text两个参数。我们使用createVNode和render函数从创建一个Message组件的虚拟节点,并将其渲染到div元素中。我们还使用了一个定时器来在3秒后移除弹框。

第二种最大的改变是省去了传入的type,用户调用时直接传入text即可。

使用

最后,我们可以通过调用message函数来显示弹框。例如:

第一种
message({ type: 'error', text: '测试弹框fun' });

第二种
message.error('测试弹框fun')

图片

error.svg

<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 20 20"><path fill="red" d="M2.93 17.07A10 10 0 1 1 17.07 2.93A10 10 0 0 1 2.93 17.07zM11.4 10l2.83-2.83l-1.41-1.41L10 8.59L7.17 5.76L5.76 7.17L8.59 10l-2.83 2.83l1.41 1.41L10 11.41l2.83 2.83l1.41-1.41L11.41 10z"/></svg>

warn.svg

<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 20 20"><path fill="#faad14" d="M2.93 17.07A10 10 0 1 1 17.07 2.93A10 10 0 0 1 2.93 17.07zM9 5v6h2V5H9zm0 8v2h2v-2H9z"/></svg>

success.svg

<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 48 48"><path fill="#52c41a" fill-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4S4 12.954 4 24s8.954 20 20 20Zm10.742-26.33a1 1 0 1 0-1.483-1.34L21.28 29.567l-6.59-6.291a1 1 0 0 0-1.382 1.446l7.334 7l.743.71l.689-.762l12.667-14Z" clip-rule="evenodd"/></svg>

总结

虽然这个组件的实现原理很简单,但是它在用户体验和功能上却非常强大。它使用了Vue.js的响应式系统和动画效果,使得弹框在显示和隐藏时都能给用户带来良好的视觉体验。

完整附件:点此下载

标签:Vue,text,Element,Plus,组件,message,弹框,type,div
From: https://blog.51cto.com/u_15723831/9069861

相关文章

  • 前端VUE JS if (!this.form.typeId)什么意思,包括数字0吗
    这行代码是在检查this.form对象的typeId属性是否为假值。如果typeId是假值(比如null、undefined、false、0、NaN或空字符串""),那么条件将被视为true。这通常用于检查对象属性是否存在或是否被设置为一个真实的值。数字0也包括吗?是的,数字0也被视为假值。在JavaScript中,条......
  • Vue异步更新和$nextTick函数
    Vue是异步dom对象更新的需求:编辑标题,编辑框自动聚焦1:点击编辑,显示编辑框2:让编辑框,立刻获取焦点可以使用$nextTick函数加载完dom之后触发想要操作dom的方法<template><div><divv-if="flag"><inputtype="text"v-model="username"ref="inp"&......
  • Vue axios 拦截器
    正常情况下打开浏览器前端页面向后端发起请求使用的是axios,无论是原生的axios还是自己封装的axios都看成是axios。发起请求之后后端去数据库里面拿数据,然后返回给前端。发起请求的地方是axios,并且你能够封装这个axios,那么你就可以添加拦截器。请求拦截器就是你在发起请求的时候应该......
  • VUE框架Vue3下使用watch监听reactive下的数据变化并使深度监视起效------VUE框架
    <template><h1>{{data.counter}}</h1><button@click="data.counter++">按一下加一</button><h1>{{data.a.b.c.d.counter1}}</h1><button@click="data.a.b.c.d.counter1++">按一下加一&l......
  • 24届春招实习必备技能(一)之MyBatis Plus入门实践详解
    一、什么是MyBatisPlus?MyBatisPlus简称MP,是mybatis的增强工具,旨在增强,不做改变。MyBatisPlus内置了内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。官网地址:https://mp.baomidou.com/主要特性无侵入:只做增......
  • vue 2实战系列 —— 复习Vue
    复习Vue近期需要接手vue2的项目,许久未写,语法有些陌生。本篇将较全面复习vue2。Tip:项目是基于ant-design-vue-proant-design-vue-pro由于cms是基于这个项目开发的,所以笔者就将其下载下来。下载后运行//按照依赖yarninstall//本地启动yarnrunserve根据提......
  • 【电影推荐系统】Spring Boot + Vue3 前后端分离项目
    目录0前言1项目前端介绍1.1项目启动和编译1.1.1项目启动1.1.2项目编译1.2前端技术栈1.3功能模块前端界面展示1.3.1基础功能模块1.3.2用户模块1.3.3特色功能展示1.3.4界面自适应实现2项目后端介绍2.1项目打包部署2.1.1项目打包2.1.2项目部署2.2后端功能实现3数据......
  • vue3的ref、reactive、toRef、toRefs
    用处:用于在setup中创建响应式变量导出:import{ref,reactive,toRef,toRefs}from'vue'区别:ref用来定义基础数据类型,String,Number,Boolean,Symbol;通过Object.defineProperty()的get和set来实现响应式;js操作数据需要.value,模版中读取不需要.valuereactive用来定义......
  • vue改错总结
    vue表单和表格一起使用的时候,表格里非编辑框不再使用v-model进行双向数据绑定,当tabledatase的数据发生变化时候,会自动渲染新的数据,但是可便捷table单元格需要用到插槽技术,当更新name的时候才会自动渲染<template><div><el-form:model="form"><el-table:data=......
  • 前端环境搭建到创建vue项目运行
    整体流程1.安装nvm管理工具,用于管理node的版本方便node版本的切换a.下载nvm1.官方下载地址:https://github.com/coreybutler/nvm-windows/releases2.备用下载地址:https://xiaocai1688.lanzouw.com/b04wvgimj密码:h33mb.直接双击安装,验证安装成功输入命令nvm-v......