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;
  // 如果是虚拟dom
  if (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 动态创建组件灵活性高,主要表现在它是编程式的,可以很方便的进行手动调用,而模板创建的组件则更易于理解和维护,各有不同的使用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Meta Pixel:助你实现高效地Facebook广告追踪

Meta Pixel 像素代码是用來衡量Facebook广告效果的一个官方数据工具&#xff0c;只要商家有在Facebook上投放广告就需要串联Meta Pixel 像素代码来查看相关数据。 它本质上是一段 JavaScript 代码&#xff0c;安装后可以让用户在自己网站上查看到访客活动。它的工作原理是加载…

FPGA高端图像处理开发板-->鲲叔4EV:12G-SDI、4K HDMI2.0、MIPI等接口谁敢与我争锋?

目录 前言鲲叔4EV----高端FPGA图像处理开发板核心板描述底板描述配套例程源码描述配套服务描述开发板测试视频演示开发板获取 前言 在CSDN写博客传播FPGA开发经验已经一年多了&#xff0c;帮助了不少人&#xff0c;也得罪了不少人&#xff0c;有的人用我的代码赢得了某些比赛、…

基于FPGA的HDMI视频接口设计

HDMI介绍 HDMI(High-DefinitionMultimedia Interface)又被称为高清晰度多媒体接口,是首个支持在单线缆上传输,不经过压缩的全数字高清晰度、多声道音频和智能格式与控制命令数据的数字接口。HDMI接口由Silicon Image美国晶像公司倡导,联合索尼、日立、松下、飞利浦、汤姆逊、东…

使用 Django 构建简单 Web 应用

当我们在使用Django构建Web应用时&#xff0c;通常将会涉及到多个步骤&#xff0c;从创建项目到编写视图、模板、模型&#xff0c;再到配置URL路由和静态文件&#xff0c;最后部署到服务器上。所以说如果有一个环节出了问题&#xff0c;都是非常棘手的&#xff0c;下面就是我们…

iPhone设备中定位应用程序崩溃问题的日志分析技巧

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

Matlab|【核心复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略

目录 主要内容 基本知识 1.问题引出 2.可控负荷 3.网络拓扑约束 4.算法流程 结果一览 1.原文结果 2.程序运行结果 下载链接 主要内容 该模型复现文章《同时考虑考虑孤岛与重构的配电网故障恢复运行策略》&#xff0c;以IEEE33配电网为分析对象&#xff0c;…

iPhone设备中通过开发者选项查看应用程序崩溃日志的实用技术

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

Mac安装Parallels Desktop 19 For Mac v19.1.0 PD19虚拟机中文一键激活版

在 Mac 上运行 Windows&#xff0c;简单&#xff0c;强大&#xff0c;无缝。 全新Parallels Desktop 19 for Mac 增强 Mac 的功能&#xff0c;在虚拟机上运行 Windows&#xff0c;同时获得超过 200000 款可用于工作、开发、学习、测试和玩游戏的 Windows 应用。已经获得Microso…

Go-知识协程

Go-知识协程 1. 基本概念1.1 进程1.2 线程1.3 协程 2. 协程的优势3. 调度模型3.1 线程模型3.2 Go调度器模型 4. 调度策略4.1 队列轮转4.2 系统调用4.3 工作量窃取4.4 抢占式调度 5. GOMAXPROCS对性能的影响 一个小活动&#xff1a; https://developer.aliyun.com//topic/lingma…

【Go】十三、面向对象:方法

文章目录 1、面向对象2、结构体实例的创建3、结构体之间的转换4、方法5、结构体值拷贝6、方法的注意点7、方法和函数的区别8、跨包创建结构体实例 1、面向对象 Go的结构体struct ⇒ Java的Class类Go基于struct来实现OOP相比Java&#xff0c;Go去掉了方法重载、构造函数和析构函…

面向对象编程中的StringBuffer类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

vulhub中Apache solr XML 实体注入漏洞复现(CVE-2017-12629)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞&#xff1a;XML…

VSCode 设置vue2模板

点击设置 > 用户代码片段 > 输入Vue &#xff08;打开vue.json&#xff09;> 将代码复制内 "Print to console": {"prefix": "<","body": ["<template>"," <div class$1></div>"…

AI绘图cuda与stable diffusion安装部署始末与避坑

stable diffusion的安装说起来很讽刺&#xff0c;最难的不是stable diffusion&#xff0c;而是下载安装cuda。下来我就来分享一下我的安装过程&#xff0c;失败了好几次&#xff0c;几近放弃。 一、安装cuda 我们都知道cuda是显卡CPU工作的驱动&#xff08;或者安装官网的解释…

FPGA高端项目:解码索尼IMX327 MIPI相机+图像缩放+HDMI输出,提供开发板+工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理自研HLS图像缩放详解图像缓存HDMI输出工程…

3d在线虚拟数字展馆让学员通过游戏化体验接受爱国主义教育

随着科技的飞速发展&#xff0c;红色展厅已不再局限于实体空间。现在&#xff0c;借助VR虚拟仿真技术的强大力量&#xff0c;我们与多家党建馆推出一个全新的教育平台——VR红色虚拟展馆。在这里&#xff0c;爱国主题与尖端技术相结合&#xff0c;为广大学生提供一种全新的、互…

iPhone设备中如何分析和解决应用程序崩溃日志的问题

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…

4-Linux实用操作

1. 各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux 某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键 ctrl c 命令输入错误&#xff0c;也可以通过快捷键 ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl …