element-ui message 组件源码分享

今日简单分享 message 组件的源码,主要从以下四个方面来分享:

1、message 组件的页面结构

2、message 组件的 options 配置

3、mesage 组件的方法

4、个人总结

一、message 组件的页面结构

二、message 组件的 options 配置

前置说明:message 并没有注册到 Vue 实例上,而是创建了一个构造函数,并将其添加到 Vue 的原型链上,可在任何一个 Vue 组件内部通过 this.$message 的方式访问。

main.js 代码位置:

main.js 的代码讲解,主要有三个功能功能:

  • 将 Message 实例化,并挂载到 body 中。
  • 处理一个页面多个实例对象的情况。如果一个页面多个实例对象,使用数组的方式存储,并改变每个实例对象垂直方向的偏移量。
  • 关闭的事件回调。处理当页面有多个实例对象时,关闭 Message 时,移除当前实例对象额高度,并调整其他实例对象的高度。设置关闭后的回调函数。
import Vue from "vue";
import Main from "./main.vue";
import { PopupManager } from "element-ui/src/utils/popup";
import { isVNode } from "element-ui/src/utils/vdom";
import { isObject } from "element-ui/src/utils/types";
let MessageConstructor = Vue.extend(Main);// 定义实例对象
let instance;
// 存储多个实例对象
let instances = [];
// 定义一个 id 的变量
let seed = 1;// 工厂函数 创建和显示消息
const Message = function(options) {// 为服务端渲染时 返回if (Vue.prototype.$isServer) return;// 接收配置对象options = options || {};// 如果 options 为字符传 则转为对象格式if (typeof options === "string") {options = {message: options,};}// 接收父组件传递过来的 onClose 方法let userOnClose = options.onClose;// 设置每个 id class 类名let id = "message_" + seed++;// 关闭的函数,调用 Message 的 close 方法options.onClose = function() {// 父组件调用实例对象中的关闭方法Message.close(id, userOnClose);};// 创建新的 Vue实例对象 MessageConstructor,并将其赋值给 instace 变量instance = new MessageConstructor({data: options,});// 设置当前实例的 id 值,此 id 作为当前实例的唯一标识instance.id = id;// 如果是虚拟domif (isVNode(instance.message)) {instance.$slots.default = [instance.message];instance.message = null;}// 将 instance 这个 Vue 实例挂载到 $el 属性所引用的 dom 元素上instance.$mount();// 将 dom 元素添加到 body 中document.body.appendChild(instance.$el);// 设置垂直方向的偏移量let verticalOffset = options.offset || 20;// 遍历实例对象数组,并将每个实例对象的高度增加 16,作用是计算每个实例对象垂直方向的偏移量instances.forEach((item) => {verticalOffset += item.$el.offsetHeight + 16;});// 设置当前实例对象垂直方向的偏移量instance.verticalOffset = verticalOffset;// 设置当前实例对象可见,即 Main 组件可见instance.visible = true;// 设置当前实例的层级,如果页面上有 n 个实例对象,每点击一次 zIndex 就增加 n// 作用是保证每次新弹出的 message 弹框都在上次的 message 弹出层之上instance.$el.style.zIndex = PopupManager.nextZIndex();// 将当前实例对象存到实例对象数组当中instances.push(instance);// 返回当前实例对象return instance;
};["success", "warning", "info", "error"].forEach((type) => {Message[type] = (options) => {if (isObject(options) && !isVNode(options)) {return Message({...options,type,});}return Message({type,message: options,});};
});// Message 定义 close 关闭方法,传入两个参数,当前实例对象的 id 和 onClose 方法
// id 为一个带有 id 参数的 className 类名
// userOnClose 为父组件传递过来的 onClose 方法
Message.close = function(id, userOnClose) {let len = instances.length;let index = -1;let removedHeight;for (let i = 0; i < len; i++) {// 关闭的当前实例对象的 id 等于实例对象组中的 id,则获取垂直方向的偏移量,并更新当前的索引if (id === instances[i].id) {removedHeight = instances[i].$el.offsetHeight;index = i;// 如果父组件传递过来的 onClose 是一个回调函数,则将当前实例对象回传给父组件if (typeof userOnClose === "function") {userOnClose(instances[i]);}// 删除实例对象组中的当前实例instances.splice(i, 1);break;}}// 如果页面无 instance 实例对象,返回if (len <= 1 || index === -1 || index > instances.length - 1) return;// 将当前实例对象后面的实例对象的垂直方向的偏移量的高度上移for (let i = index; i < len - 1; i++) {let dom = instances[i].$el;dom.style["top"] =parseInt(dom.style["top"], 10) - removedHeight - 16 + "px";}
};// closeAll 关闭所有实例对象
Message.closeAll = function () {for (let i = instances.length - 1; i >= 0; i--) {// 关闭当前实例对象instances[i].close();}
};export default Message;

isNode 方法:

2.1 message 属性,消息文字,类型 string / VNode,无默认值。

2.2 type 属性,主题,类型 string,success/warning/info/error,默认 info。

2.3 iconClass 属性,自定义图标的类名,会覆盖 type,类型 string,无默认值。

2.4 dangerouslyUseHTMLString 属性,是否将 message 属性作为 HTML 片段处理,类型 boolean,默认 false。

2.5 customClass 属性,自定义类名,类型 string,无默认值。

2.6 duration 属性,显示时间, 毫秒。设为 0 则不会自动关闭,类型 boolean,默认 false。

2.7 showClose 属性,是否显示关闭按钮,类型 boolean,默认 false。

2.8 center 属性,文字是否居中,类型 boolean,默认 false。

2.9 onClose 方法,关闭时的回调函数, 参数为被关闭的 message 实例,类型 function,无默认值。

2.10 offset 属性,Message 距离窗口顶部的偏移量,类型 number,默认 20。

三、message 组件的方法

3.1 close 关闭当前的 Message。

close 方法使用的代码:

展示效果如下:

3.2 closeAll 手动关闭所有 Message。

方法使用的代码如下:

展示效果如下:

四、个人总结

第一次研究动态创建组件实例,有两个心得:

4.1 和模板中静态声明组件略有不同,核心点是使用 Vue.extend,创建可复用组件构造器。

4.2 动态创建组件灵活性高,主要表现在它是编程式的,可以很方便的进行手动调用,而模板创建的组件则更易于理解和维护,各有不同的使用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/585702.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…

R语言技能 | 不同数据类型的转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

Springboot工程依赖包与执行包分离打包与构建docker 镜像

文章目录 一、概述二、工程概况1. 代码原始结构2. 运行界面 三、常规打包1. 打包命令2. jar包结构 四、分离依赖包、执行包步骤1. 引入依赖包管理插件2. 打包验证 五、分离后构建docker 镜像1. 借助Dockerfile2. docker-maven-plugin实现 六、版本升级 一、概述 某大数据项目&…

卡通纸箱空空如也404源码

源码介绍 卡通纸箱空空如也404源码&#xff0c;喜欢的小伙伴可以下方预览看看&#xff0c;满意之后下载放到任何目录都可以使用&#xff01; 源码下载 卡通纸箱空空如也404源码

Android获取本地文件目录

一、实现效果 一个简单的demo。点击按钮&#xff0c;获取本地文件目录&#xff0c;可以选择图片&#xff0c;展示选取的对应图片和展示存储路径。如图所示&#xff1a; 二、实现方式 1. 权限 AndroidManifest.xml文件里面添加权限 <uses-permission android:name"a…

Free RTOS day2

1.思维导图 2.使用PWMADC光敏电阻完成光控灯的实验 int adc_val0;//用于保存ADC采样得到的数值 float volt0;//用于保存电压值 int main(void) {MX_GPIO_Init();MX_DMA_Init();MX_TIM1_Init();MX_USART1_UART_Init();MX_ADC_Init();MX_TIM3_Init();HAL_TIM_PWM_Start(&hti…

ES学习日记(七)-------Kibana安装和简易使用

前言 首先明确一点&#xff0c;Kibana是一个软件&#xff0c;不是插件。 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic stack 成员之一&#xff0c;设计用于和Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索&#xff0c;…

【Go】十五、接口、多态、断言

文章目录 1、接口的引入2、接口3、接口的注意点4、多态5、断言6、Type Switch 1、接口的引入 以日常生活中打招呼为例&#xff0c;定义接口规范&#xff0c;各国人为打招呼为具体的实现 package main import "fmt"//接口的定义&#xff1a;定义规则、定义规范&…

【Ubuntu】用 VMware 安装 macOS

本教程使用 Ubuntu 20.04.6 LTS&#xff0c;VMware Workstation Pro 17.5.1&#xff0c;macOS Sonoma 14.4。文中所有需要的下载链接均以 Markdown 的形式体现在文字上。 下载 VMware Workstation Pro&#xff0c;目前最新版本是 17.5.1。 使用密钥&#xff0c;进行破解。 VM…

4.1作业

对菱形继承给出的代码中每一个类&#xff0c;写一个有参构造函数写出下列类的&#xff0c;构造函数(有参、无参)&#xff0c;析构函数&#xff0c;拷贝构造函数和拷贝赋值函数 class Father { int *p; const string name; } class Son:public Father { int *age; 3整理思维导图…

51单片机学习笔记12 SPI接口 使用1302时钟

51单片机学习笔记12 SPI接口 使用1302时钟 一、DS1302简介1. 功能特性2. 涓流充电3. 接口介绍时钟数据和控制线&#xff1a;电源线&#xff1a;备用电池连接&#xff1a; 二、寄存器介绍1. 控制寄存器2. 时间寄存器3. 日历/时钟寄存器 三、BCD码介绍四、DS1302时序1. 读时序2. …

linux时间同步工具chrony的配置和时间设置的相关说明

目录 目录 介绍 1.搭建ntp服务器 2.配置ntp客户端 3.其他设置 4.客户端无法进行时间同步 介绍 目前比较流行的时间同步工具有ntpd和chrony&#xff0c;ntpd采用123/UDP端口通信&#xff0c;chrony采用323/UDP端口通信。Centos7以上版本默认安装chrony服务来同步时间&#x…