Custom Elements 初中高阶教程:从零开始

阅读时长 13 分钟读完

前言

Custom Elements 是 Web Components 标准的核心,是一种自定义 HTML 元素的 API。通过 Custom Elements 可以创建单独的自定义组件,并且这些组件可以像普通 HTML 标签一样被使用和操纵。

以下内容将从零开始,带领读者一步步学习 Custom Elements 的创建和使用,包括初、中、高阶的教程,希望能够帮助读者深入理解 Custom Elements 的使用。

初阶教程

1. 创建 Custom Elements

首先,需要创建一个继承自 HTMLElement 的类,并用 customElements.define 方法注册它:

这样就创建了一个名为 my-element 的 Custom Element。

2. 使用 Custom Elements

将自定义元素放入 HTML 中,可以像其他 HTML 元素一样使用它:

3. 添加属性和方法

我们可以在上面创建的 MyElement 类中添加属性和方法。

例如,我们可以添加一个单击事件监听器,在单击元素时控制台输出一条消息:

-- -------------------- ---- -------
----- --------- ------- ----------- -
  ------------- -
    --------

    ------------------------------ -- -- -
      ------------------------
    ---
  -
-

----------------------------------- -----------

通过在 constructor 中添加事件监听器,我们实现了一个简单的单击事件响应功能。

4. 设置元素属性

我们可以为自定义元素添加属性,并在属性值发生变化时做出响应。这里我们使用 attributeChangedCallback 方法来实现。

例如,我们为自定义元素添加一个 text 属性,当它的值变化时,将它赋值给元素的第一个子节点:

-- -------------------- ---- -------
----- --------- ------- ----------- -
  ------------- -
    --------
  -

  ------ --- -------------------- -
    ------ ---------
  -

  ------------------------------ --------- --------- -
    -- ----- --- ------- -
      ---------------------------- - ---------
    -
  -
-

----------------------------------- -----------

-- ------- ---------- ----- ---- --
----- ------- - -------------------------------------
---------------------------- ------ ---------

5. 修改样式

我们可以为自定义元素添加样式。此处我们使用 Shadow DOM 技术,它允许我们将元素的 DOM 和样式封装在其中,避免与来自外部的样式发生冲突。

例如,我们设置元素背景颜色为灰色:

-- -------------------- ---- -------
----- --------- ------- ----------- -
  ------------- -
    --------

    ----- ------ - ------------------- ----- ------ ---

    ----- --- - ------------------------------
    --------------- - --- ---------
    ------------------------- - -------

    ------------------------
  -
-

----------------------------------- -----------

这样,我们就创建了一个自定义元素,它的背景颜色为灰色。

中阶教程

1. 继承已有元素

通过继承已有的标准元素,我们可以从中获益。例如,我们可以通过继承 button 元素来创建一个自定义的按钮:

-- -------------------- ---- -------
----- -------- ------- ----------------- -
  ------------- -
    --------
    ------------------------------ -- -- -
      ------------------------
    ---
  -
-

---------------------------------- --------- - -------- -------- ---

注意在自定义元素注册时,需要使用 extends 属性声明这是一个继承了哪个标准元素的 Custom Element。

2. SLOT

SLOT 是 Custom Elements 标准的重要特性之一,它允许您向自定义元素注入动态内容。变量中的 slot 将在自定义元素内部的模板中用于指定插入内容的位置。

例如,在一个自定义弹出框中,我们可以将内容放在 <slot> 标签中:

-- -------------------- ---- -------
--------- ---------------------
  -------
    ------- -
      ----------------- -----
      ------- --- ----- -----
      -------------- ----
      -------- -----
    -
  --------
  ---- ---------------
    -------------
  ------
-----------

--------
  ----- ------ ------- ----------- -
    ------------- -
      --------
      ----- -------- - -------------------------------------------
      ----- ------ - ------------------- ----- ------ ---
      -----------------------------------------------------
    -
  -

  --------------------------------- --------
---------

现在,当我们将要插入的内容放在 <x-dialog> 标签内,将在弹出框中显示:

3. 自定义事件

Custom Element 可以定义自己的事件。通过自定义事件,我们可以扩展标准事件处理,控制元素的行为或与其他元素交互。

例如,我们可以为自定义元素添加一个 modify 事件:

-- -------------------- ---- -------
----- --------- ------- ----------- -
  ------------- -
    --------
  -

  ------------------- -
    ------------------------------- -- -- -
      -------------------------
    ---
  -

  ---------- -
    ----- ----- - --- ----------------------
    --------------------------
  -
-

----------------------------------- -----------

connectedCallback 中,我们为元素添加了一个 modify 事件的监听器。在 doModify 方法中,我们将创建一个新的 CustomEvent 对象,并使用 dispatchEvent 方法触发这个事件。

4. 绑定数据

我们可以通过在自定义元素内部使用数据绑定模板或单向数据绑定属性,将数据绑定到自定义元素上。

例如,我们为自定义元素添加一个 data 属性,在属性值变化时显示它的值:

-- -------------------- ---- -------
----- --------- ------- ----------- -
  ------------- -
    --------
  -

  ------ --- -------------------- -
    ------ ---------
  -

  ------------------------------ --------- --------- -
    -- ----- --- ------- -
      ---------------- - ---------
    -
  -

  --- ----------- -
    ------------------------- -------
  -

  --- ------ -
    ------ --------------------------
  -
-

----------------------------------- -----------

使用以下代码设置 data 属性后,MyElement 元素将显示属性值:

高阶教程

对于高级开发者来说,如果需要为更复杂的应用程序创建自定义元素,他们需要深入了解 Shadow DOM,事件系统,通信以及传递属性等相关主题。这里我们简单介绍几个方面。

1. Shadow DOM 的详细操作

Shadow DOM 是 Web Components 技术中的一个底层特性。它允许开发人员创建封装了其样式、标记和行为的可重复使用的 Web 组件。使用 Shadow DOM,我们可以将 DOM 结构和样式封装在元素的 Shadow DOM 中,从而避免 CSS 样式冲突。

例如:

-- -------------------- ---- -------
----- ------------- ------- ----------- -
  ------------- -
    --------

    -- --------- ------ --- ----
    ----- ----- - --- ----------------------- -
      -------- ------
      ----------- -----
      --------- -----
    ---

    ----- ------ - ------------------- ----- ------ ---

    -- ------------ ---
    ----- --------- - ------------------------------
    ------------------- - ----------- - ----------------- ----- ---------
      -------- ------------

    -- - --- -- ------ ----
    ------------------------------

    -- -- ------ --- ------
    --------------------------
  -
-

--------------------------------------- ---------------

2. 过滤属性

我们可以使用过滤器拦截其他人传递给自定义元素的属性。

例如:

-- -------------------- ---- -------
----- ------------- ------- ----------- -
  ------ --- -------------------- -
    ------ ------------
  -

  ------------------------------ --------- --------- -
    -- ----- --- ---------- -
      -- ---------------------------------------- -
        ----------------------- ----------
      -
    -
  -

  --- -------------- -
    ---------------------------- -------
  -

  --- --------- -
    ------ -----------------------------
  -

  --- --------------- -
    ------ ----- ---- -----
  -
-

--------------------------------------- ---------------

如果属性 allowed 的值不在 allowedValues 的列表中,我们通过 setAttribute 将属性的值重置为以前的值。

3. 全局事件通信

Custom Elements 之间通信的一种方式是使用 CustomEvent 对象。我们可以创建自定义事件,添加需要传递的数据,然后通过派发事件来发送数据。

例如:

-- -------------------- ---- -------
----- ------------- ------- ----------- -
  ------------- -
    --------

    ----- ----- - ----------------------------------------
    --------------------------------- ------- -- -
      -------------------- ---- -------- --------------
    ---
    ------------------------

    ----- ----- - --- ----------------------------- -
      ------- ------ --------
      -------- -----
      --------- -----
    ---
    ------------------------------
  -
-

--------------------------------------- ---------------

----- ------------ ------- ----------- -
  ------------- -
    --------
  -

  ------------------- -
    ------------------------------------------- ------- -- -
      ------------------- ---------- --------------
      ----- ----------- - --- ---------------------- -
        ------- --------- -----------------
      ---
      --------------------------------
    ---
  -
-

-------------------------------------- --------------

ParentElement 中创建一个 ChildElement 元素并添加一个事件监听器,以便在 ChildElement 中接收 message 事件并在控制台中记录它。然后创建一个名为 global-message 的事件,并在全局上触发它。

最后,在 ChildElement 元素上附加一个事件监听器,以在 global-message 事件派发时记录一个消息,并在此处发出一个名为 message 的事件,将从 global-message 事件中提取的消息通过事件细节传递给 ParentElement

总结

Custom Elements 是 Web Components 标准非常重要的一部分,通过创建自定义元素,我们可以方便的扩展 HTML 元素,并且使它们具有复杂的功能。本文从初、中、高阶三个方面详细讲解了 Custom Elements 的应用,希望能为读者提供帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6491378e48841e9894f385cc

纠错
反馈