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 的了解和使用有所帮助。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/678235ba935627c900fc9f9b