Message消息提示是这样的页面提示

如果你在使用Vue那可能会使用element-ui中消息提示,如果你在使用React,那么可能会使用ant-design的消息提示。他们的原理都相似,这篇文章将会带你手写实现消息提示组件。

这两个UI框架在消息提示组件上的用法大致相同,用例如下:

Message.success('This is a success message');

消息提示组件并不是直接在模板中使用,而是当做普通的方法进行调用,方法调用的时候会把组件渲染到页面中,那么它渲染的HTML是如何创建的呢?其实渲染的DOM还是一个组件,只不过是通过Message方法进行了一层包装,通过方法让外界调用更简单。

Vue

先准备好消息提示组件,消息提示是一个列表,可以添加多个消息内容,每次消息只有几秒的显示时间将会消失,那么代码如下结构:

<template><div><ul><li v-for="(item, index) in messages" :key="index" class="message">{{ item.message }}</li></ul></div>
</template><script>
export default {data () {return {messages: [],id: 0}},methods: {add (options) {let layer = {id: this.id++,...options}layer.timer = setTimeout(() => {this.remove(layer)}, 2000);this.messages.push(layer)},remove (layer) {this.messages = this.messages.filter(item => item.id !== layer.id)}}
}
</script><style>
.message {position: fixed;left: 50%;top: 30px;transform: translate3d(-50%, 0, 0);background: #000;background: #f0f9eb;color: #67c23a;padding: 10px 20px;border-radius: 4px;animation: move 0.3s;
}@keyframes move {0% {top: 0;opacity: 0;}100% {top: 30px;opacity: 1;}
}
</style>

通过方法进一步包装组件,可以调用某个方法让消息提示显示出来。关键是组件已经准备好了,要考虑如何挂在到页面中,有几个API大家很少用到的。注意下面代码:

import Vue from 'vue'
import MessageComponent from './MessageComponent.vue'class Msg {constructor () {let vm = new Vue({render: h => h(MessageComponent)}).$mount()document.body.appendChild(vm.$el)this.component = vm.$children[0]}success (options) {this.component.add(options)}
}Msg.getInstance = (function () {let instance;return function () {if (!instance) {instance = new Msg()}return instance}
})()export const Message = Msg.getInstance()

现在消息提示已经封装完成,可以使用了。

React

其实一开始只准备Vue的消息提示,但是考虑到React也有很多人可能用到,所有添加了这部分内容。

原理也十分类似,先准备好组件DOM结构和基本的交互操作

import React, { Component } from 'react';
import './Message.css'class MessageComponent extends Component {constructor(props) {super(props)this.state = {id: 0,messages: [],max: 5}}add = (options) => {let { id, messages } = this.statelet layer = {id: id++,...options}layer.timer = setTimeout(() => {this.remove(layer)}, 2000);messages.push(layer)this.setState({ id, messages })}remove = (layer) => {clearTimeout(layer.timer)let messages = this.state.messages.filter(item => item.id !== layer.id)this.setState({ messages })}render() {return (<ul>{this.state.messages.map((item, index) => <li key={item.id} className="message">{item.message}</li>)}</ul>);}
}export default MessageComponent;

再加上一些样式。

.message {position: fixed;left: 50%;top: 30px;transform: translate3d(-50%, 0, 0);background: #000;background: #f0f9eb;color: #67c23a;padding: 10px 20px;border-radius: 4px;animation: move 0.3s;
}@keyframes move {0% {top: 0;opacity: 0;}100% {top: 30px;opacity: 1;}
}

关键是DOM挂载的方式不一样

import React from 'react';
import ReactDOM from 'react-dom';
import MessageComponent from './MessageComponent'class Msg {constructor () {let myRef = {current: ''}const div = document.createElement('div')document.body.append(div)ReactDOM.render(<MessageComponent ref={myRef} />, div)this.refs = myRef}success (options) {this.refs.current.add(options)}
}Msg.getInstance = (function () {let instance;return function () {if (!instance) {instance = new Msg()}return instance}
})()export const Message = Msg.getInstance()

现在你已经学会消息提示组件的原理,可以看出这样的做法是让使用组件的人更加简便,但是多添加了一层封装组件的代码逻辑。

Message消息提示组件的原理相关推荐

  1. vue自定义插件 封装一个类似 element 中 message 消息提示框的插件

    vue自定义插件 封装一个类似 element 中 message 消息提示框的插件 一.资源文档 1.vue内置组件 transition 2.Vue.use() 3.Vue.extend() 4. ...

  2. 如何让Element UI的Message消息提示每次只弹出一个

    Element UI的Message消息提示是点击一次触发一次的.在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况.虽然客户使用的时候一般来说不会出 ...

  3. 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个

    一.遇到的问题 Element UI的Message消息提示是点击一次触发一次的.在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况.虽然客户使用的时 ...

  4. React 如何封装消息提示组件message--Material-UI

    近期项目在使用Material-UI ,Material-UI 的消息提示组件是<Alert />,<Alert />没有主动提示的能力,属于被动组件,需要在页面中嵌入,然后通 ...

  5. Tooltip是一个消息提示组件

    Tooltip是一个消息提示组件,当用户点击或者长按时显示提示,在屏幕阅读器能够使它语音化,这有助于视力障碍人士阅读,用法如下: Tooltip(message: '这是提示',child: Icon ...

  6. html标签的message,Message 消息提示

    Message 消息提示 Message 消息提示 常用于主动操作后的反馈提示.与 Notification 的区别是后者更多用于系统级通知的被动提醒. 基础用法 从顶部出现,3 秒后自动消失. Me ...

  7. JS:原生JS实现message消息提示框

    简介 学习了一下如何使用原生JS(加上class类)实现message消息提示框的封装(繁琐版). 使用到的主要技术点:class类,JS. 功能点 1.四种提示状态(message success ...

  8. 让ElementUI Message消息提示每次只弹出一次

    官方效果图 遇到的情况是,一进入页面,为空的数据要message消息提示没有该数据,如果很多数据为空,就会如上图弹一整个页面的弹框,用户体验就不是很好. 我目前的解决方案是: 在main.js文件写入 ...

  9. ElementUI 消息提示组件Message

    目录 官方地址 应用场景 基本用法 通知类型 偏移量 使用HTML代码片段 开启关闭按钮 文字内容居中 自定义图标iconClass onClose close实例方法 全局引入 单独引用 Optio ...

最新文章

  1. R语言all函数、any函数判断逻辑向量(logical vector)实战
  2. 腾讯投资过 600 多家公司不惊奇,京东也有出手 260+ | 大公司投资并购盘点
  3. Windows Azure 解决方案系列:组合拍卖供应商以云服务快速拓展,并节省成本
  4. java对cookie的操作_java对cookie的操作
  5. 动态修改dom node的两种方法性能比较
  6. Attention和增强RNN (Attention and Augmented Recurrent Neural Networks)
  7. 【转】c# 操作webservice(经典入门教程+MSDN必胜)(有自己修改的部分)
  8. OpenCV_01 简介+无版权安装+模块分析
  9. kettle资源库配置
  10. python3 pygame load图片不显示_Python——mac下pygame踩坑,绘制图像不加载
  11. Python机器学习:贝叶斯文本分类器
  12. rust腐蚀 木制窗户怎么修_潜艇围壳上的窗户为什么不会裂开?
  13. 多台或者集群环境下如何保证spring定时器只执行一个
  14. 新员工入职表_基于APortal框架搭建员工入职培训平台
  15. linux下如何模拟按键输入和模拟鼠标
  16. win10蓝牙android上网,Win10开启蓝牙移动热点共享上网教程
  17. IOS错误之----警告 Local declaration of 'XXX' hides insta
  18. 7-176 数列求和
  19. 架构师之spring------@Autowire注入多泛型实例 can not cast to的问题解决
  20. Win10切换共享文件夹账号

热门文章

  1. 信通院 DevOps 新标准评估结果发布:腾讯获评唯一卓越级
  2. 华为HarmonyOS 2.0全面升级,构建中国软件的“根”!
  3. 市场占比 44%,IDC 最新报告:阿里云智能语音市场排名第一
  4. 那些基础不好的程序员,后来怎么样了?
  5. 快速用 Haskell 构建超级简单的 Web 技术栈!
  6. VS Code 必知必会的 20 个快捷键!
  7. 从一片空白到世界领先,中国通信翻身逆袭史
  8. 移动互联网这十年,跨平台技术的演进及 Flutter 的未来
  9. 一文详解 Java 的八大基本类型!
  10. Google,一切皆为 AI!