随着前端技术的发展,我们对于组件化的要求变得越来越高。而 Web Components 作为未来的组件化方案,就是为了解决当前前端领域面临的问题而被提出来的。Web Components 表示一套标准,它利用原生的 Web 技术实现了一套完整的、可复用的组件化方案。
Web Components 由四个技术组成:
- Custom Elements:自定义元素。
- Shadow DOM:隐蔽的 DOM 树。
- HTML Templates:HTML 模板。
- HTML Imports:HTML 导入。
下面我们来将每个技术逐一解析。
Custom Elements
Custom Elements 允许你定义自己的 HTML 元素,这些 HTML 元素可以带有自己的行为和属性。定义一个自定义元素的流程如下:
- 使用
window.customElements.define
方法定义一个新元素。 - 使用
extends
属性来扩展已有的 HTML 元素。
下面是创建一个自定义元素的例子:
-- -------------------- ---- ------- ----- --------- ------- ----------- - ------------- - -- ----------- --- ---- -------- ----- ------ - ------------------------ --------- ----- --- - ------------------------------ ----- ----- - -------------------------------- ----------------- - - --- - ------ ---- - -- --------------- - ------- -------- -------------------------- ------------------------ - - ------------------------------------------ -----------展开代码
Custom Element 的生命周期方法
Custom Element 有完整的生命周期方法,包括:
constructor()
: 在元素被创建时调用。connectedCallback()
: 在元素第一次被连接到文档 DOM 时调用。disconnectedCallback()
: 在元素从文档 DOM 中被移除时调用。attributeChangedCallback(name, oldValue, newValue)
: 在元素属性值被更改时调用。
Custom Element 继承已有元素的好处
Web Components 允许继承已有的元素,可以让我们创建符合语义的元素。比如,我们可以创建一个自定义的按钮元素:
-- -------------------- ---- ------- ----- -------- ------- ----------------- - ------------- - -------- ------------------------------ -- -- - ------------- --------- --- - - ----------------------------------------- --------- - -------- -------- ---展开代码
这里我们通过继承 HTMLButtonElement
来创建自己的按钮元素 my-button
。这个按钮会在被点击时弹出一个提示框,由此可见,这个按钮带有自己的行为。
Shadow DOM
Shadow DOM 是一种隔离的 DOM 树,它允许我们将自定义元素的标记、样式和行为分离出来,从而避免与全局 DOM 产生命名冲突。使用方法如下:
const shadow = this.attachShadow({mode: 'open'}); const div = document.createElement('div'); div.textContent = 'Hello, World!'; shadow.appendChild(div);
这里我们使用 attachShadow
方法来创建一个隐蔽的 DOM 树。然后我们可以在 shadow DOM 树上添加我们需要的元素和样式。
使用 shadow DOM 可以提高 Web 应用程序的可组合性和可扩展性,并允许你编写出更具有可重用性和独立性的组件。
HTML Templates
HTML Templates 是一个可以包含任意 HTML 内容的标记,可以在代码中声明并插入内部描写的元素,而不必先把它插入到 DOM 中。例如:
<template id="my-template"> <div> <h1>Hello, World!</h1> <p>This is my awesome template.</p> </div> </template>
我们可以通过 JavaScript 中的 content.cloneNode
方法来复制这个模板:
const template = document.querySelector('#my-template'); const content = template.content.cloneNode(true); document.body.appendChild(content);
这里我们使用 cloneNode
方法复制了 my-template
的内容,并把它附加到了 <body>
元素下面。
HTML Imports
HTML 导入允许你从 HTML 文件中导入 HTML 片段和脚本作为依赖项。比如,我们可以有这样的文件 my-component.html
:
<template id="my-component"> <div> <h1>Hello, World!</h1> <p>This is my awesome component.</p> </div> </template> <script src="my-component.js"></script>
我们可以用 HTML 导入来导入这个文件:
<link rel="import" href="my-component.html">
这里我们使用 link
标签来导入 my-component.html
文件。这样,我们就可以在当前 HTML 文件里使用 my-component
的内容和脚本。
总结
Web Components 组成了未来的组件化方案,其主要由 Custom Elements、Shadow DOM、HTML Templates 和 HTML Imports 四个技术所组成。它允许我们封装可复用的组件,并带有自己的行为和样式。同时,Web Components 又兼顾了 Web 的通用性和灵活性,因此它是 Web 应用程序的绝佳选择。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6498284548841e989453b0f4