Web Components 是一种新型的 Web 开发技术,它是由 W3C 标准化的。它是由以下 4 个技术规范组成:
- Custom Elements:允许开发者创建自定义 HTML 元素;
- Shadow DOM:提供了一个在浏览器中封装元素的方式,让一个组件的样式和行为不受外界影响;
- HTML Templates:是一个新的 HTML 标签,用于定义客制化的模板;
- ES Modules:允许 JavaScript 模块化。
Web Components 的目的是让开发者能够创建可重用的自定义组件,并使这些组件可以在不同的页面和不同项目中使用,从而为网页和应用程序提供更好的可维护性和可拓展性。
Custom Elements
Custom Element 允许开发者创建自定义的 HTML 标签,可以让开发者将组件分装为一个独立的自定义 HTML 元素。在创建 Custom Element 的时候,我们注册一个新的标签名,然后使用一个类继承 HTMLElement 类,以实现自定义元素的行为。
-- -------------------- ---- ------- -- ---- -------- -- ----- -------- ------- ----------- - ------------- - -------- - ------------------- - -------------- - ------------- -------------- -------------- ------------- - - -- --------- ---------------------------------- ----------
上面的代码中,我们定义了一个自定义元素 ItemList,它继承了 HTMLElement 类,并实现了一个 connectedCallback 方法,在元素被添加到页面上时会调用该回调函数,它向元素添加了一些列表项的 HTML 内容。
我们通过 customElements.define
方法来注册这个自定义元素到浏览器中,第一个参数是元素名称,第二个参数就是我们定义的元素类。
现在可以在 HTML 中使用 <item-list></item-list>
这个标签了,它将会呈现出我们上面定义的列表项。这样,我们就实现了一个简单的自定义组件。
Shadow DOM
Shadow DOM 可以让开发者将组件的样式和行为封装到组件内部,从而使组件的样式和行为与外部不受干扰。Shadow DOM 内部有一棵独立的 DOM 树,与外部的 DOM 结构分开管理。
-- -------------------- ---- ------- ----- -------- ------- ----------- - ------------- - -------- -- -- ------ --- --- ----- ------ - ------------------- ----- ------ --- -- - ------ --- --------- ----- ---- - ----------------------------- -------------- - --------- -------------- -------------- -------- -- ------ ------ --- - ------------------------- -- -------- ------ --- - ----- ----- - -------------------------------- ----------------- - - -- - ---------------- ----- ------- -- -------- -- - -- - -------- ------- ----------------- ----- -------------- ------- - -- -------------------------- - - ---------------------------------- ----------
上面的代码中,我们使用 this.attachShadow
方法创建了一个 Shadow DOM 根节点,它的 mode 属性为 open,表示我们可以访问到这个 Shadow DOM。我们创建了一个列表元素和一个样式元素,然后将它们都添加到了 Shadow DOM 中。
在 HTML 中使用 <item-list></item-list>
这个标签时,它将自动呈现出我们定义的样式和内容,同时也是与外部隔离的。
HTML Templates
HTML Templates 是一个新的 HTML 标签,它允许我们定义一些自定义的模板。这些模板可以在组件中被多次使用,并可以动态地插入数据。一个 HTML 模板是一个包含了 HTML 元素,并且在页面上不可见的 HTML 片段。
-- -------------------- ---- ------- ----- -------- ------- ----------- - ------------- - -------- -- -- ------ --- --- ----- ------ - ------------------- ----- ------ --- -- ------ ----- -------- - ---------------------------------------------- ----- ------- - --------------------------------- -- ------ ----- ---- - ---------------------------- --- ---- - - -- - -- -- ---- - ----- ---- - ----------------------------- ---------------- - ----- ------ ----------------------- - -- - ------ --- ------- ---------------------------- - - ---------------------------------- ----------
上面的代码中,我们定义了一个模板元素,它的 ID 是 item-list-template
。我们在 Shadow DOM 中获取模板的内容,并使用 cloneNode
方法克隆了一个副本,然后向列表中动态添加了三个列表项的内容,并将它们添加到 Shadow DOM 中。
在 HTML 中,我们可以定义一个 <template>
元素,它的 id
属性为 item-list-template
,然后将列表项的数据留空,如下所示:
<template id="item-list-template"> <ul> <!-- 这里留空 --> </ul> </template> <item-list></item-list>
上面的代码中,我们使用了 <template>
元素来定义一个模板,它的 ID 是 item-list-template
。然后使用自定义元素 <item-list>
来呈现我们定义的模板,模板的内容将会被动态地插入到组件的 Shadow DOM 中。
ES Modules
ES Modules 是一种新的 JavaScript 模块化的方式。它使用 import
和 export
关键字来导入和导出模块。每个 ES 模块都是一个独立的文件,文件内容被视为一个模块,它可以在任何地方进行导入。
-- -------------------- ---- ------- -- ------------ ----- -------- ------- ----------- - ------------- - -------- -- -- ------ --- --- ----- ------ - ------------------- ----- ------ --- -- ------ ----- -------- - ---------------------------------------------- ----- ------- - --------------------------------- -- ------ ----- ---- - ---------------------------- --- ---- - - -- - -- -- ---- - ----- ---- - ----------------------------- ---------------- - ----- ------ ----------------------- - -- - ------ --- ------- ---------------------------- - - ------ - -------- --
-- -------------------- ---- ------- ---- ---------- --- --------- ------------------------ ---- ---- ---- --- ----- ----------- ------- -------------- ------ - -------- - ---- ----------------- ---------------------------------- ---------- --------- -----------------------
上面的代码中,我们将组件的代码放在了一个独立的文件中,并通过 export
关键字导出该组件。在 index.html 中,我们使用 import
关键字将 ItemList 组件导入,并通过自定义元素 <item-list>
呈现该组件。这样我们就实现了 ES 模块化的组件开发。
结语
Web Components 是一种强大的 Web 开发技术,它可以帮助我们更好地创建自定义组件,并实现组件在不同场景中的复用。上面的内容是一个简要的介绍和使用指南,关于 Web Components 的更多内容还有很多可以探索和学习。希望本文对大家对 Web Components 的了解和使用有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/678235ba935627c900fc9f9b