Web Component 探索之旅
Web Component 是什么?
简介
Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的功能封装在您的代码之外)并且在您的 web 应用中使用它们。
-- Web Components | MDN[1]
关于它的其它介绍:
组件是前端的发展方向,现在流行的 React 和 Vue 都是组件框架。而 Web Component 相比第三方框架,原生组件简单直接,符合直觉,不用加载任何外部模块,代码量小。目前,已经发展的比较成熟,并用于生产环境。
组件化开发使得我们可以将页面切割成模块便于封装和开发,而 Web Component 在此基础上,可以将每个组件渲染在独立的 DOM 树中,天然支持模块间样式和逻辑的隔离。
特性
这里会对 Web Component 的相关属性做一个简单介绍。
Web Component 特性完整代码:
https://codesandbox.io/s/snowy-darkness-jmdip7
Custom Elements
一组 Javascript API,允许您定义 Custom Elements 及其行为,然后在您的用户界面中按照需要使用它们。
window.customElements
// custom button
class CustomButton extends HTMLElement {constructor() {super();const button = document.createElement("button");button.innerText = this.getAttribute("name") || "custom button";button.disabled = true;this.appendChild(button);}
}window.customElements.define("custom-button", CustomButton);
window.customElements.get
该方法用来获取自定义组件的构造函数,接收一个参数,即声明的自定义组件的 name,返回构造函数。
const getCustomConstructorBefore = customElements.get('custom-button');
// getCustomConstructorBefore before: undefined
console.log('getCustomConstructorBefore before: ', getCustomConstructorBefore);
customElements.define("custom-button", CustomButton);
const getCustomConstructorAfter = customElements.get('custom-button');
// getCustomConstructorAfter after: ƒ CustomButton() {}
console.log('getCustomConstructorAfter after: ', getCustomConstructorAfter);
window.customElements.upgrade
customElements upgrade() 方法升级节点子树中文档的所有包含 shadow dom 的(亲测,可以不包含 shadow dom)自定义元素,甚至在它们连接到主文档之前。接收一个参数,即一个自定义组件节点,无返回值。
// 先创建自定义标签
const el = document.createElement("spider-man");class SpiderMan extends HTMLElement {}
// 后声明构造函数
customElements.define("spider-man", SpiderMan);// false
console.log(el instanceof SpiderMan);
// 建立自定义标签与构造函数之间的绑定关系
customElements.upgrade(el);
// true
console.log(el instanceof SpiderMan);
window.customElements.whenDefined
该方法用来检测并提供自定义组件被定义声明完毕的时机,接收一个参数,即自定义元素的 name,返回值是一个 Promise,若提供的 name 无效,则触发 Promise 的 catch,可以用来判断是否定义了同名的 Custom Element。
Custom Element 重复定义的报错:
我们可以用这个方法来捕获重复定义的报错,最推荐 define 之前先 get 一下~
customElements.whenDefined('custom-button').then(() => {customElements.define('custom-button', CustomButton);
}).catch((err) => {console.log(err, 'err-----')
});
捕获的报错信息:
生命周期
Custom Elements
提供了一些生命周期函数,使得我们能在自定义元素在 DOM 中的行为变化后执行相关逻辑。
ConnectedCallback:当自定义元素第一次被连接到文档 DOM 时调用(类似组件 Mounted);
attributeChangedCallback:当自定义元素的一个属性被增加、移除或更改时被调用,需要配合静态方法 observedAttributes 来使用,设置只有注册在 observedAttributes 中的属性才被监听;
disconnectedCallback:当自定元素与文档 DOM 断开连接时调用(类似 Unmount);
adoptedCallback:当自定义元素被移动到新文档时被调用;
示例代码:
class CustomButton extends HTMLElement {constructor() {super();const button = document.createElement("button");button.innerText = "custom button";button.addEventListener("click", this.changeAttribute.bind(this));const textSpan = document.createElement("span");textSpan.innerText = this.getAttribute("text") || "default";textSpan.className = "info";this.appendChild(button);this.appendChild(textSpan);}connectedCallback() {console.log("自定义button被连接到DOM啦~");}// observedAttributes,定义特定属性变化时,触发attributeChangedCallback函数// 未定义的属性改变,则不会触发回调static get observedAttributes() {return ["style", "text"];}// 与observedAttributes结合使用attributeChangedCallback(name, oldValue, newValue) {if (name === "text" &&oldValue !== newValue &&this.querySelector(".info")) {this.querySelector(".info").innerText = newValue;}}changeAttribute() {this.setAttribute("text", "sfsdfd");}disconnectedCallback() {console.log("自定义button与DOM断开连接啦~");}adoptedCallback() {// 创建一个iframe的document,并移动进去console.log("自定义button移动到新文档啦~");}clickToRemove() {// 从DOM中移除自身this.parentNode.removeChild(this);}
}window.customElements.define("custom-button", CustomButton);
Shadow DOM
一组 Javascript API,可以将封装的“Shadow DOM”树附加到元素(与主文档分开呈现),并控制其关联的功能。通过这种方式,您可以拥有一个天然的沙箱环境,保持元素的功能私有,实现样式和脚本的隔离,不用担心与文档的其他部分发生冲突。
示例代码:
class CustomShadowDOM extends HTMLElement {constructor() {super();// 创建一个shadowDOMconst shadow = this.attachShadow({ mode: "open" });const info = document.createElement("span");const style = document.createElement("style");const css = "span { color: red; }";style.type = "text/css";style.appendChild(document.createTextNode(css));info.setAttribute("class", "info");info.textContent = this.getAttribute("text") || "default";// shadow可以创建一个不受外部影响,切拥有内部js运行逻辑,拥有独立的// css的自定义元素(也就是web component),shadow.appendChild(style);shadow.appendChild(info);}
}window.customElements.define("custom-shadow-dom", CustomShadowDOM);
并非只能在 CustomElement 下使用,即便是普通的 HTMLElement 也能使用这一技术来实现样式保护,详见
Web Component 探索之旅相关推荐
- 【Web技术】1555- Web Component 探索之旅
Web Component 是什么? 简介 Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的功能封装在您的代码之外)并且在您的 web 应用中使用它们. -- Web ...
- Web 探索之旅 | 第二部分第一课:客户端语言
-- 作者 谢恩铭 转载请注明出处 Web探索之旅 | 第二部分 第二部分第一课:客户端语言 第二部分第二课:服务器语言 第二部分第三课:框架和内容管理系统 第二部分第四课:数据库 第二部分第五课:响 ...
- 浏览器向服务器发送的消息称为,网络是怎样连接之浏览器的探索之旅读书笔记(一)...
照例是写在前面的话,今天在这里想和自己说一些话,希望未来的自己能够记住,就像我在简书的签名里写下的,"希望自己能记得当下写下那段文字的初心!",学习其实是一件非常严肃的事情,它容不 ...
- ASPNet请求处理机制初步探索之旅Part2核心
ASPNet请求处理机制初步探索之旅Part2核心 开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反 ...
- Linux 探索之旅 | 第四部分第二课:SSH 连接,安全快捷
-- 作者 谢恩铭 转载请注明出处 内容简介 第四部分第二课:SSH连接,安全快捷 第四部分第三课预告:文件传输,潇洒同步 SSH连接,安全快捷 上一课是 Linux探索之旅 | 第四部分第一课:压缩 ...
- 网络是怎样连接的 - 探索之旅路线图
虽然Web服务器在收到订单数据之后和销售系统一起对订单进行实际处理的操作很复杂,但其实浏览器和Web服务器之间的交互却很简单,概括如下. (1)浏览器向Web服务器发送请求. (2) Web服务器根据 ...
- 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性
内容简单介绍 1.第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的 ...
- Linux 探索之旅 | 第三部分第五课:延时执行,唯慢不破
-- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第五课:延时执行,唯慢不破 第三部分第六课预告:第三部分测验题 延时执行,唯慢不破 上一课 Linux探索之旅 | 第三部分第四课:后台运行及合并 ...
- 美团外卖商家端视频探索之旅
美团外卖商家端视频探索之旅 背景 美团外卖至今已迅猛发展了六年,随着外卖业务量级与日俱增,单一的文字和图片已无法满足商家的需求,商家迫切需要更丰富的商品描述手段吸引用户,增加流量,进而提高下单转化率和 ...
最新文章
- 2019cvpr oral | 实时自适应立体匹配
- Spring点滴一:Spring Ioc 容器
- 消控中心人员配置_建筑能耗监测系统集中化运行管理模式和人员配置!
- 回溯算法【0-1背包问题】
- 点击连接后不刷新就不显示页面的bug修复
- 面试题——20190717
- Phaser3让超级玛丽实现轻跳、高跳及加上对应的跳跃声音
- armgcc交叉编译的文件无法运行_从0开始搭建基于ARM GCC的软件系统02——使用ARM GCC编译SDK
- 卷积神经网络学习笔记与心得(2)数据集
- 7-2 数列循环右移 (10 分)
- 阿里云域名注册与备案、服务器ECS购买与登录使用
- 华为的“少年天才”攀登者,出发向智能存储的“奥林帕斯山”
- 直播回顾|关联网络如何反团伙欺诈——标准答案版
- AI原创生成器1.3版-9大改动
- Java 常用工具类 - 校验身份证 IdCardUtils
- Oracle服务与配置
- freemarker生成word文件,word文件打不开解决方法。
- 人工智能与大数据-2018
- wowza 配置自己的VOD-Edge 实现一个vod点播
- 武汉大学 计算机软件工程 张宇,2021年武汉理工大学计算机技术考研成功经验分享...
热门文章
- 【Web技术】1555- Web Component 探索之旅