iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3实现Message消息组件示例
  • 476
分享到

Vue3实现Message消息组件示例

2024-04-02 19:04:59 476人浏览 独家记忆
摘要

目录组件设计 定义最终的组件 api 定义组件结构 模板和样式 模板 Template 消息图标 样式 组件脚本 创建组件实例 1、创建包裹容器,并设置外层的 Class 属性 2、

在大多数 WEB 产品中,全局的 Message 组件占有较大的使用场景,它常出现在给与用户反馈、信息提示和与系统的对话场景中。如果使用传统的组件写法,则需要引入组件并在 components 中注册,然后再去模板中以标签的形式调用,传入自定义 props 属性并通过 emit 触发事件,这类的组件往往有以下缺点:

  • 需要频繁引入并注册
  • 需要在模板中以标签的形式使用组件
  • 需要额外的参数控制组件的属性和状态
  • 不能友好的自定义组件的挂载位置,会被其他组件影响

因此对于 Message 这类的组件,我们希望可以在 javascript 中调用,可以传入自定义参数控制组件状态,并且无需在调用的时候手动挂载组件到 body 尾部。如果你使用过主流第三方库,例如 ElementUI plus 或 Ant Design for Vue, 那么你肯定熟悉他们的消息组件 API,接下来就一起用 vue3 实现一个全局的 Message 组件吧。

组件最终实现效果

组件设计

定义最终的组件 API

实现一个简易的 Message 消息组件,包含类型 API 有文本(text)、成功(success)、失败(error),即支持直接传入一段文本,也支持通过组件具体的 option 配置,来自定义消息内容、关闭延迟、以及是否展示关闭按钮等功能。


// Message 类型(type):文本、成功、失败
["text", "success", "error"]

// Message 选项(option)
[String]: 消息内容
[Object]: 消息配置

// option 配置
text [String] "" 消息内容
duration [Number] 0 自动关闭延迟毫秒数,0为不自动关闭
close [Boolean] false 是否展示关闭按钮

// 调用方式
Message[type](option);

调用示例


Message.text("这是一条消息提示");
Message.error({
    text: "网络错误,请稍后再试",
    duration: 3000,
    close: true
});

定义组件结构

建立 Message 文件夹存储组件的整体结构,其中 src 中包含组件的模板、样式和实例文件,同级下,建立 index.js 将整个组件暴露出去,以便在项目和业务组件中引入。


|--- Message
 |--- src
 | |--- Message.vue // 组件模板
 | |--- Message.less // 提供组件样式支持
 | |--- Message.js // 读取配置并渲染组件实例
 | |--- Instance.js // 组件实例
 |---index.js // 暴露组件

模板和样式

模板 Template

模板相对来说比较简单,外层由动画组件包裹,通过 v-show 去控制消息显示和关闭,内容部分包括图标、消息文本、以及可配置的手动关闭按钮。


<template>
  <!-- 消息列表 -->
  <transition name="slide-fade">
    <div class="message-container" v-show="visibled">
      <!-- 内容 -->
      <div class="message-content">

        <!-- 消息类型图标,通过消息类型确定,text类型不配置图标 -->
        <div class="message-icon" v-if="config.icon">
          <i :class="config.icon"></i>
        </div>

  <!-- 消息文本 -->
        <span v-text="config.content"></span>

        <!-- 手动关闭消息 -->
        <div class="option" v-if="!config.close">
          <i class="ri-close-fill" @click="onClose"></i>
        </div>

      </div>
    </div>
  </transition>
</template>

消息图标

需要注意的是,图标是由调用 API 中的类型确定,在创建实例的时候确定图标类型,这里引用的是开源图标库 Remix Icon,具体的引用方法这里不多赘述,地址:remixicon.cn/

样式

在 Message.less 中定义样式和动画。


@radius: 4px;
@nORMalHeight: 34px;

.message {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  text-align: center;
  box-sizing: border-box;
  z-index: 9999;
  transform: translateZ(9999px);
  padding-top: 28px;
  transition: top .4s ease;

  .message-container {
    margin-bottom: 14px;

    .message-icon {
      display: inline-block;

      i {
        font-size: 18px;
        font-weight: 400;
        margin-top: -3px;
        margin-right: 6px;
        display: inline-block;
        box-sizing: border-box;
        vertical-align: middle;
      }

      .ri-checkbox-circle-fill {
        color: #58c05b;
      }

      .ri-close-circle-fill {
        color: #fd4f4d;
      }

    .message-content {
      display: inline-block;
      padding: 4px 18px;
      height: @normalHeight;
      text-align: left;
      line-height: @normalHeight;
      font-size: 14px;
      font-weight: 400;
      border-radius: @radius;
      color: #595959;
      box-shadow: 0 4px 12px rgba(0, 0, 0, .15);
      background: #ffffff;

      .option {
        display: inline-block;
        pointer-events: all;
        margin-left: 18px;

        i {
          font-size: 18px;
          font-weight: 400;
          margin-top: -3px;
          display: inline-block;
          box-sizing: border-box;
          vertical-align: middle;
          cursor: pointer;
          color: #d9d9d9;
          transition: color 0.2s ease;

          &:hover {
            color: #ff7c75;
            transition: color 0.2s ease;
          }
        }
      }
    }
  }

  .slide-fade-enter-active {
    transition: all .2s ease-out;
  }

  .slide-fade-leave-active {
    transition: all .2s ease;
  }

  .slide-fade-enter-from,
  .slide-fade-leave-to {
    transform: translateY(-20px);
    opacity: 0;
  }
}

组件脚本

组件中通过获取传入的config配置和remove实现渲染和取消挂载,通过onOpen和onClose方法控制消息打开和手动关闭,具体代码如下:


<script>
import { Reactive, toRefs } from "vue";
export default {
  props: {
    config: { type: Object, default: () => {} }, // 消息配置项
    remove: { type: Function, default: () => {} }, // 取消挂载回调
  },
  setup(props) {
    const state = reactive({
      visibled: false,
    })

    // 打开消息
    const onOpen = (config) => {
      setTimeout(() => {
        state.visibled = true;
      }, 10)

      // 指定时间后移除消息
      if (config.duration !== 0) {
        setTimeout(() => {
          onClose();
        }, config.duration);
      }
    }

    onOpen(props.config)

    // 消息关闭
    const onClose = () => {
      state.visibled = false;
      setTimeout(() => {
        props.remove()
      }, 200)
    };

    return {
      ...toRefs(state),
      onOpen,
      onClose,
    };
  },
};
</script>

创建组件实例

接下来将在 Instance.js 中编写组件调用时创建、挂载、销毁组件等 API,头部引入 Vue 的创建实例方法和上面写好的组件模板:


import { createApp } from 'vue'
import Message from './Message.vue'

声明实例操作方法,接受一个消息配置参数cfg



const createInstance = cfg => {
 const config = cfg || {}
 // 1、创建包裹容器,并设置外层的 Class 属性、消息计数

 // 2、创建实例并挂载到 body
 
 // 3、实现取消挂载方法,和取消挂载后重新计数
}
export default createInstance

1、创建包裹容器,并设置外层的 Class 属性

创建一个 DIV 作为外层容器包裹组件,并设置对应 class 属性


let messagenode = document.createElement('div')
let attr = document.createAttribute("class")
attr.value = "message"
messageNode.setAttributeNode(attr)

消息计数,我们定义一个消息弹框的高度为 54 px,在多个消息排队打开的时候,通过设置 top 值使各组件错开。


const height = 54 // 单个消息框高度

const messageList = document.getElementsByClassName('message')
messageNode.style.top = `${messageList.length * height}px`

2、创建实例并挂载到 body


const app = createApp(Message, {
  config,
  remove() {
    handleRemove()// 移除元素,消息关闭后从 Dom 上取消挂载并移除
  }
})

// 挂载实例并追加到 body 结尾
app.vm = app.mount(messageNode)
document.body.appendChild(messageNode)

app.close = () => {
  handleRemove()
}

return app

3、其中定义取消挂载和重新设置 top 值的方法


const handleRemove = ()=>{
  app.unmount(messageNode)
  document.body.removeChild(messageNode)
  resetMsgTop()
 }

const resetMsgTop = () => {
  for (let i = 0; i < messageList.length; i++) {
    messageList[i].style.top = `${i * height}px`
  }
}

实现渲染实例 API

通过 Message.js 去读取配置并渲染。


import createInstance from './Instance.js'


function renderMsg(typeCfg = {}, cfg = '') {
  // 允许直接传入消息内容,因此要判断传入的 cfg 类型
  const isContent = typeof cfg === 'string'

  // 整合自定义配置
  cfg = isContent ? {
    content: cfg
  } : cfg

  const config = Object.assign({}, typeCfg, cfg) // 合并配置

  const {
    type = 'text', // 消息类型
    content = '', // 消息内容
    duration = 3000, // 自动关闭延迟时间
    close = false // 是否显示关闭按钮
  } = config

  // 创建实例
  return createInstance({
    type,
    content,
    duration,
    close
  })
}

暴露text、success、error等 API。


export default {
  // 纯文本消息
  text(cfg = "") {
    const textCfg = {
      type: "text",
      icon: ''
    }

    return renderMsg(textCfg, cfg);
  },
  // 成功提示
  success(cfg = "") {
    const successCfg = {
      type: "success",
      icon: 'ri-checkbox-circle-fill'
    }

    return renderMsg(successCfg, cfg);
  },
  // 错误提示
  error(cfg = "") {
    const errorCfg = {
      type: "error",
      icon: 'ri-close-circle-fill'
    }

    return renderMsg(errorCfg, cfg);
  },
}

最后,在最外层的index.js中开放这个组件以供调用。


import Message from './src/Message.js';

export default Message;

到此这篇关于 Vue3实现Message消息组件示例的文章就介绍到这了,更多相关Vue3 Message消息组件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网! 

--结束END--

本文标题: Vue3实现Message消息组件示例

本文链接: https://www.lsjlt.com/news/128784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3实现Message消息组件示例
    目录组件设计 定义最终的组件 API 定义组件结构 模板和样式 模板 Template 消息图标 样式 组件脚本 创建组件实例 1、创建包裹容器,并设置外层的 Class 属性 2、...
    99+
    2022-11-12
  • Vue3封装 Message消息提示实例函数详解
    目录Vue3封装 消息提示实例函数样式布局封装 message.vue功能实现 message.js注册 自定义指令使用 :总结Vue3封装 消息提示实例函数 Vue2.0...
    99+
    2022-11-12
  • vue实现过渡动画Message消息提示组件示例详解
    目录概述目录结构总结概述 在我自己平时做项目的时候,必不可少的会用到message组件,用来对用户友好反馈,总之使用频率还是挺高的,刚开始工作的时候,经常用的就是组件库的现成的,想想...
    99+
    2022-11-13
  • Vue.extend实现组件库message组件示例详解
    目录概述Vue.extendmessage 组件配置对象(就是.vue文件)message 生成组件的函数使用方法效果图总结概述 当我们使用组件库的时候,某些组件并不是直接放到模板当...
    99+
    2022-11-13
  • Message组件实现发财UI 示例详解
    目录引言支持的功能使用方法实现过程如何实现不同类型的切换?如何实现Message的弹出和消失?如何实现往下排列而非堆叠?如何实现添加和移除.message-active类?如何将隐藏...
    99+
    2022-11-13
    Message组件发财UI Message组件
  • JavaScript实现消息框示例
    在JavaScript 中可以创建三种消息框:警告框、确认框、提示框。 警告框 警告框通常用于确保用户可以得到某些信息。 当警告框出现后,用户需要点击确定按钮才能继续进行操作。 语法...
    99+
    2022-11-12
  • vue如何实现消息提示全局组件
    这篇文章主要介绍了vue如何实现消息提示全局组件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用vue-cli3.0生成项目toast全局...
    99+
    2022-10-19
  • vue3实现H5表单验证组件的示例
    目录效果图描述实现思路与element-ui表单组件差异非uni-app平台的移植效果图 描述 基于vue.js,不依赖其他插件或库实现;基础功能使用保持和 element-ui ...
    99+
    2023-05-16
    vue3 H5表单验证 vue3 表单验证
  • Go+Kafka实现延迟消息的实现示例
    目录前言原理简单的实现生产者延迟服务消费者改进点通用的延迟服务生产者负责延迟服务总结前言 延迟队列是一个非常有用的工具,我们经常遇到需要使用延迟队列的场景,比如延迟通知,订单关闭等等...
    99+
    2022-11-13
  • Rabbitmq消息推送功能实现示例
    目录一.前言1.1场景1.2消息交换机三种形式二.建设demo工程2.1依赖2.2yml文件指定rabbitmq连接信息2.3直连型消息链接一.前言 1.1场景 在我们实际开发中到一...
    99+
    2022-12-27
    Rabbitmq消息推送 Rabbitmq消息分发
  • Vue3封装回到顶部组件的实现示例
    我们在网页中应该经常可以看到回到顶部这个功能,这个功能也比较简单。 代码:  <template> <div class="page-content-...
    99+
    2022-11-13
  • 基于Vue3实现日历组件的示例代码
    以下是一个基于 Vue 3 实现的简单日历组件的代码示例。这个日历组件包含了前一个月、当前月、下一个月的日期,并且可以支持选择日期、切换月份等功能。 <template>...
    99+
    2023-05-17
    Vue3实现日历组件 Vue3日历组件 Vue3日历 Vue 日历
  • 利用vue3仿苹果系统侧边消息提示效果实例
    目录动效预览其他UI库开始组件目录结构toasts.vue大概的DOM结构index.js注册组件 & 定义全局变量instance.js手动挂载实例完整代码总结动效预览 最...
    99+
    2022-11-12
  • 使用Vue3实现一个Upload组件的示例代码
    目录通用上传组件开发我们需要实现如下功能自定义模版支持文件上传列表支持一系列生命周期钩子事件,上传事件拖拽支持写在最后通用上传组件开发 开发上传组件前我们需要了解: Fo...
    99+
    2022-11-12
  • Vue3+TS实现语音播放组件的示例代码
    目录第一步:点击拖拽进度条第二步:操作媒体音频第三步:进度条和播放进度关联完整代码该功能将使用vue3 + TS来实现语音播放组件,使用什么技术不重要,重要的是看懂了核心逻辑后,通过...
    99+
    2022-11-13
  • 前端与RabbitMQ实时消息推送未读消息小红点实现示例
    目录引言RabbitMQ 搭建1、开启 mqtt 协议服务端消息发送1、mqtt 客户端依赖包2、消息发送者前端消息订阅测试总结 引言 前几天粉丝群里有个小伙伴问过:web ...
    99+
    2022-11-13
  • Uniapp全局消息提示以及其组件的实现方法
    目录一、前言二、实现1.短轮询请求-App.vue中2.全局消息提示组件(1)定义一个GlobalMessage.vue组件(2)新建GlobalMessage.js(3)main....
    99+
    2022-11-13
  • 基于Vue3实现印章徽章组件的示例代码
    目录一、组件实现代码二、组件全局注册代码三、组件应用代码需要实现的组件效果: 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 组件代码文件结构 src/com...
    99+
    2023-05-18
    Vue3实现印章徽章组件 Vue3印章徽章组件 Vue3印章组件 Vue3 组件
  • 基于Vue3实现无限滚动组件的示例代码
    目录为什么还要使用无限滚动组件无限滚动的优点无限滚动的缺点主要分为三个部分1.模拟 API 调用2.制作我们的内容组件3.显示我们的内容4.Vue3 无限滚动如果你在社交媒体上停留的...
    99+
    2022-11-13
  • Android实现未读消息小红点显示实例
    目录代码实现小红点实现总结使用 fragmentLayout 实现,可以把小红点添加到任意 view 上。 效果 添加小红点到 textview 上 添加小红点到 imagevie...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作