在 Web 应用程序中使用 Custom Elements 进行页面构建

阅读时长 8 分钟读完

简介

Web 应用程序的界面构建是其中一个最基本的部分。而传统 Web 开发只有 HTML、CSS 和 JavaScript,无法做到更高级别的抽象,使得组件化复用成为一件非常困难的事情。而随着 Web Components 规范被提出,我们可以使用 Custom Elements 来实现真正的组件化复用,将页面结构、样式和行为从代码中解耦出来,形成一份通用的组件资源,再把这些组件拼接起来构成我们的 Web 页面。

Custom Elements 是 Web Components 的一部分,它提供了使用自定义元素扩展 HTML 的能力。我们可以使用它来创建一个自己的 HTML 元素,其中既包含了功能的 JavaScript 代码,也包含了样式和模板。

本文将深入探讨如何使用 Custom Elements,在 Web 应用程序中实现更高级别的抽象。

自定义元素的基础

在使用 Custom Elements 前,我们需要对它提供的基础 API 有一些了解。

customElements.define()

使用自定义元素我们需要先定义它,这可以通过调用 customElements.define() 方法来实现。

第一个参数是自定义元素的名称,必须由连字符分隔的 minuscule 命名。

第二个参数是具体对应的实现类。实现类必须继承自 HTMLElement 或其子类,以便自定义元素的正确呈现和行为。

constructor() 方法

定义后,就可以使用自定义元素了。当一个该自定义元素第一次出现在文档中的时候,constructor() 方法将被调用。这时我们可以在此做一些初始化的工作,比如初始化一些属性值和监听事件。

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

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

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

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

如果希望在定义时指定属性,可以使用 connectedCallback() 方法。

connectedCallback() 方法

connectedCallback() 方法被调用时,custom element 已经被加入到了文档的 DOM 中,正式对外可见了。那么我们可以在这里实现一些挂载到元素上的行为,比如渲染模板、事件监听等。

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

disconnectedCallback() 方法

disconnectedCallback() 方法在 custom element 从文档移除时被调用。此处我们可以做一些善后工作,比如清理定时器和取消监听器等。

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

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

observedAttributes() 方法

observedAttributes() 方法用于观察 custom element 上的属性变化,并在属性变化时执行某些操作。

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

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

在调用 observedAttributes() 方法时,需要使用 static 修饰符,表示该方法是静态方法。返回一个属性名称数组,用于通知浏览器哪些属性应该被观察和监听变化。

attributeChangedCallback() 方法

当被观察指定的属性值发生变化时,attributeChangedCallback() 方法将被调用。

自定义元素的应用

Custom Elements 最常见的应用场景就是实现复杂多层级的组件。我们将编写一个 example-counter 组件来演示 Custom Elements 的应用。

示例代码

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

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

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

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

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

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

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

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

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

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

说明

在上面这个示例中,我们先定义了一个 ExampleCounter 类,该类实现了自定义元素基础 API:constructor()、connectedCallback()、disconnectedCallback()、observedAttributes()、attributeChangedCallback()。它有一个 value 属性和一些操作它的方法,还包含一个简单的模板和一些事件监听器。

最后我们可以通过调用 customElements.define() 来注册 ExampleCounter 类为 example-counter 自定义元素,在应用时只需要在 DOM 中添加 example-counter 的标签,即可显示出实现组件的效果。

结论

Custom Elements 是 Web Components 中最为基础的部分,它可以用来扩展 HTML 元素,定义我们自己的标记,并将其行为和样式封装在一起以便在项目中复用。使用 Custom Elements 在页面构建中应用组件化思想,将代码的重用性、可读性,以及可维护性都提升到了更高的层面。它的出现让我们更好的控制界面的交互,让代码更加简单、直观、优美,提升开发效率和代码可靠性。

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

纠错
反馈