Message消息提示组件的原理
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消息提示组件的原理相关推荐
- vue自定义插件 封装一个类似 element 中 message 消息提示框的插件
vue自定义插件 封装一个类似 element 中 message 消息提示框的插件 一.资源文档 1.vue内置组件 transition 2.Vue.use() 3.Vue.extend() 4. ...
- 如何让Element UI的Message消息提示每次只弹出一个
Element UI的Message消息提示是点击一次触发一次的.在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况.虽然客户使用的时候一般来说不会出 ...
- 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个
一.遇到的问题 Element UI的Message消息提示是点击一次触发一次的.在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况.虽然客户使用的时 ...
- React 如何封装消息提示组件message--Material-UI
近期项目在使用Material-UI ,Material-UI 的消息提示组件是<Alert />,<Alert />没有主动提示的能力,属于被动组件,需要在页面中嵌入,然后通 ...
- Tooltip是一个消息提示组件
Tooltip是一个消息提示组件,当用户点击或者长按时显示提示,在屏幕阅读器能够使它语音化,这有助于视力障碍人士阅读,用法如下: Tooltip(message: '这是提示',child: Icon ...
- html标签的message,Message 消息提示
Message 消息提示 Message 消息提示 常用于主动操作后的反馈提示.与 Notification 的区别是后者更多用于系统级通知的被动提醒. 基础用法 从顶部出现,3 秒后自动消失. Me ...
- JS:原生JS实现message消息提示框
简介 学习了一下如何使用原生JS(加上class类)实现message消息提示框的封装(繁琐版). 使用到的主要技术点:class类,JS. 功能点 1.四种提示状态(message success ...
- 让ElementUI Message消息提示每次只弹出一次
官方效果图 遇到的情况是,一进入页面,为空的数据要message消息提示没有该数据,如果很多数据为空,就会如上图弹一整个页面的弹框,用户体验就不是很好. 我目前的解决方案是: 在main.js文件写入 ...
- ElementUI 消息提示组件Message
目录 官方地址 应用场景 基本用法 通知类型 偏移量 使用HTML代码片段 开启关闭按钮 文字内容居中 自定义图标iconClass onClose close实例方法 全局引入 单独引用 Optio ...
最新文章
- R语言all函数、any函数判断逻辑向量(logical vector)实战
- 腾讯投资过 600 多家公司不惊奇,京东也有出手 260+ | 大公司投资并购盘点
- Windows Azure 解决方案系列:组合拍卖供应商以云服务快速拓展,并节省成本
- java对cookie的操作_java对cookie的操作
- 动态修改dom node的两种方法性能比较
- Attention和增强RNN (Attention and Augmented Recurrent Neural Networks)
- 【转】c# 操作webservice(经典入门教程+MSDN必胜)(有自己修改的部分)
- OpenCV_01 简介+无版权安装+模块分析
- kettle资源库配置
- python3 pygame load图片不显示_Python——mac下pygame踩坑,绘制图像不加载
- Python机器学习:贝叶斯文本分类器
- rust腐蚀 木制窗户怎么修_潜艇围壳上的窗户为什么不会裂开?
- 多台或者集群环境下如何保证spring定时器只执行一个
- 新员工入职表_基于APortal框架搭建员工入职培训平台
- linux下如何模拟按键输入和模拟鼠标
- win10蓝牙android上网,Win10开启蓝牙移动热点共享上网教程
- IOS错误之----警告 Local declaration of 'XXX' hides insta
- 7-176 数列求和
- 架构师之spring------@Autowire注入多泛型实例 can not cast to的问题解决
- Win10切换共享文件夹账号