Web Components 是什么

devtools/2024/11/6 14:47:25/

Web Components 是一套不同的 web 标准,它们允许开发者创建可重用的自定义元素(通过封装 JavaScript 类来定义),这些元素封装了 HTML、CSS 和 JavaScript。

Web Components 主要包括以下几个部分:

  1. Custom Elements:允许开发者定义自己的元素,扩展 HTML。
  2. Shadow DOM:提供了一种将一个 Web Component 的内部实现细节隐藏起来的方法,从而创建一个封装的影子树(shadow tree)。
  3. HTML Templates:提供了一个客户端的模板系统,允许开发者定义客户端的 DOM 树,这些树在页面加载时是隐藏的,直到被 JavaScript 激活。
  4. HTML Imports:一种浏览器技术,允许开发者将 HTML 文档导入到其他 HTML 文档中,类似于 CSS 和 JavaScript 的 @import。
  • Custom Elements代码示例

// 定义一个新的元素 'my-element'
class MyElement extends HTMLElement {constructor() {super(); // 调用 HTMLElement 的构造函数this.attachShadow({ mode: 'open' }); // 创建一个 Shadow DOMthis.shadowRoot.innerHTML = `<style>p { color: red; }</style><p> Hello, World! </p>`;}// 定义一个方法,可以在元素上调用sayHello() {console.log('Hello from MyElement!');}
}// 定义元素
customElements.define('my-element', MyElement);// 使用新的元素
const myEl = document.createElement('my-element');
document.body.appendChild(myEl);
myEl.sayHello(); // 输出:Hello from MyElement!
  • Shadow DOM 代码示例

允许将一个 Web Component 的内部实现细节隐藏起来

class MyComponent extends HTMLElement {constructor() {super();this.attachShadow({ mode: 'open' });this.shadowRoot.innerHTML = `<style>:host { color: red; }</style><slot>Default content</slot>`;}
}customElements.define('my-component', MyComponent);const myComponent = document.createElement('my-component');
myComponent.shadowRoot.querySelector('slot').addEventListener('click', () => {console.log('Slot clicked');
});document.body.appendChild(myComponent);
//my-component 是一个自定义元素,它使用了 Shadow DOM 来封装样式和内容。<slot> 元素用于插入外部内容。
  • HTML Templates 代码示例

HTML Templates 提供了一个客户端的模板系统:

<template id="my-template"><style>p { color: green; }</style><p>This is a template.</p>
</template><script>class MyTemplateElement extends HTMLElement {constructor() {super();const template = document.querySelector('#my-template');const instance = template.content.cloneNode(true);this.appendChild(instance);}}customElements.define('my-template-element', MyTemplateElement);
</script><my-template-element></my-template-element>
//<template> 标签定义了一个模板,MyTemplateElement 类使用这个模板来创建一个自定义元素的实例。

this.attachShadow是什么 

this.attachShadow 是一个方法,它属于 Web Components 规范的一部分,用于在自定义元素(Custom Elements)上创建一个 Shadow DOM。Shadow DOM 是一种浏览器技术,它允许开发者将一个 Web Component 的内部实现细节隐藏起来,创建一个封装的影子树(shadow tree),这样可以避免样式和脚本冲突,实现更好的封装和组件化。 

基本用法

当你在自定义元素的类中调用 this.attachShadow 方法时,你需要传递一个对象作为参数,该对象包含一个 mode 属性,它定义了 Shadow DOM 的模式:

  • open:默认值,允许 JavaScript 访问 Shadow DOM 树。
  • closed:Shadow DOM 树对 JavaScript 来说是不可见的,无法通过 JavaScript 访问。

示例代码

下面是一个使用 this.attachShadow 的示例:

class MyElement extends HTMLElement {constructor() {super(); // 调用父类的构造函数this.attachShadow({ mode: 'open' }); // 创建一个可访问的 Shadow DOMthis.shadowRoot.innerHTML = `<style>p { color: red; }</style><p> Hello, World! </p>`;}
}customElements.define('my-element', MyElement);const myEl = document.createElement('my-element');
document.body.appendChild(myEl);

MyElement 是一个自定义元素,它使用 this.attachShadow 方法创建了一个 Shadow DOM。然后,它将一些 HTML 和 CSS 插入到 Shadow DOM 中。由于使用了 { mode: 'open' },这个 Shadow DOM 是可访问的,可以通过 this.shadowRoot 属性来访问。 


http://www.ppmy.cn/devtools/131784.html

相关文章

使用kettle同步数据流程

使用kettle同步数据流程 一&#xff0e;Kettle软件安装&#xff08;解压即可使用&#xff09; 1.windows安装解压 pdi-ce-8.2.0.0-342.zip&#xff0c;点Spoon.bat启动kettle 2.Linux安装 把data-integration目录所有文件上传到服务器 二&#xff0e;安装数据库驱动把需要的…

TCP建立连接之后怎么保持长连接(检测连接断没断)

在TCP连接建立后&#xff0c;保持长连接的主要方式是通过定期的心跳检测&#xff08;Keep-Alive&#xff09;和超时机制。以下是一些具体的方法和机制 1. TCP Keep-Alive TCP协议本身提供了一种Keep-Alive机制&#xff0c;可以通过以下步骤实现&#xff1a; 启用Keep-Alive&…

数据结构————链表

一、引言 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容量为100&#xff0c;满了以后增容到200&#x…

【JavaScript】axios 二次封装拦截器(接口、实例、全局)

学习 coderwhy 老师结合 ts 二次封装 axios 目录结构 config config\index.ts // export const BASE_URL "http://codercba.com:9002"; export const TIME_OUT 10000;// 1. 根据环境变量区分接口地址 // let BASE_URL: string; // if (process.env.NODE_ENV &qu…

RabbitMQ 不公平分发介绍

RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。在 RabbitMQ 中&#xff0c;消息分发策略对于系统的性能和负载均衡至关重要。默认情况下&#xff0c;RabbitMQ 使用公平分发&#xff08;Fair Dispatch&#xff09;策…

Ollama AI 框架缺陷可能导致 DoS、模型盗窃和中毒

近日&#xff0c;东方联盟网络安全研究人员披露了 Ollama 人工智能 (AI) 框架中的六个安全漏洞&#xff0c;恶意行为者可能会利用这些漏洞执行各种操作&#xff0c;包括拒绝服务、模型中毒和模型盗窃。 知名网络安全专家、东方联盟创始人郭盛华表示&#xff1a;“总的来说&…

PyTorch实战-手写数字识别-MLP模型

1 需求 包懂&#xff0c;40分钟掌握PyTorch深度学习框架&#xff0c;对应神经网络算法理论逐行讲解用PyTorch实现图像分类代码_哔哩哔哩_bilibili 10分钟入门神经网络 PyTorch 手写数字识别_哔哩哔哩_bilibili pytorch tutorial: PyTorch 手写数字识别 教程代码 从零设计并训…

数据结构的双向链表

1、头插法创建双向链表&#xff0c;节点是学生信息&#xff08;学号&#xff0c;分数&#xff0c;姓名&#xff09; 2、调用函数遍历链表所有信息 3、调用函数&#xff0c;求出分数是完数的学生&#xff0c;并输出该学生所有信息 4、调用函数&#xff0c;按照姓名查找某个学…