在现代浏览器中使用 Custom Elements

阅读时长 9 分钟读完

在现代前端开发中,我们通常会使用各种组件库来方便地构建页面中的交互元素。但随着 Web 平台的发展,浏览器原生提供的 API 能力也越来越丰富,其中就包括了 Custom Elements API。

Custom Elements 允许我们创建自定义的 HTML 元素,这些元素可以被像普通的 HTML 元素一样使用,它们可以被添加到 DOM 树中,可以被 JavaScript 中的其他代码访问和操作。

为什么要使用 Custom Elements

使用 Custom Elements 可以带来诸多好处:

  • 更清晰的应用逻辑:通过自定义元素,我们可以将页面中的各个组件封装为单独的元素,每个元素有自己的内部实现,也有独立的 API 可以供外部调用。这样可以使得应用逻辑更加清晰,避免了代码的混淆和耦合。
  • 更灵活的表现形式:自定义元素可以自定义 HTML 标签名和样式,从而达到更好的展示效果。它们还可以被使用在 Shadow DOM 中,从而实现更好的样式隔离和 DOM 封装。
  • 更高的通用性:通过自定义元素,我们可以将页面的功能拆分成不同的组件,这些组件可以被多个应用复用,提高了代码的可维护性和复用性。

如何使用 Custom Elements

使用 Custom Elements 需要先定义一个继承自 HTMLElement 的类,并给它实现一些生命周期回调和其他需要的方法。然后通过 window.customElements.define 方法来将这个类注册为自定义元素。

定义自定义元素类

下面是一个简单的例子,定义了一个 MyButton 类,它继承自 HTMLElement 类,实现了几个元素的生命周期回调和一些其他的方法:

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

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

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

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

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

  -- -- ----- --
  --- ------- -
    ------ ---------------------------
  -
-
展开代码

在上面的示例中,我们在构造函数中使用 attachShadow 方法创建了一个 Shadow DOM,并创建了一个 button 元素作为内部 DOM。

之后,我们还定义了一些生命周期回调:

  • connectedCallback:元素被插入到 DOM 树中时会调用。在这里我们打印了一个日志,表明元素已经被插入到了 DOM 中。
  • attributeChangedCallback:元素的某个属性被修改时会调用。在这里我们再次打印了一个日志,表明属性已经被修改。
  • disconnectedCallback:元素从 DOM 树中移除时会调用。在这里我们打印了一个日志,表明元素已经被移除。

除此之外,我们还定义了一个 getter 方法,用于获取 label 属性的值。

注册自定义元素

定义了 MyButton 类之后,我们需要通过 window.customElements.define 方法来将它注册为自定义元素:

上面的代码中,我们使用定义了 my-button 标签名来注册 MyButton 类,这样我们就可以在 HTML 中使用 <my-button> 标签来使用这个自定义元素了。

使用自定义元素

使用自定义元素和普通的 HTML 元素是一样的。我们只需要在 HTML 中使用 <my-button> 标签就可以了。

然后我们就可以在 JavaScript 中使用这个自定义元素了:

当然,我们也可以通过 JavaScript 来动态创建这个元素,并将它添加到 DOM 中:

自定义元素实践

下面我们通过一个简单的实例来演示如何在实践中使用 Custom Elements。

构建一个计数器

我们假设我们需要在页面中构建一个计数器,可以显示当前计数值,并且有“加1”和“减1”两个按钮,可以实现计数值的修改。

首先我们需要定义一个继承自 HTMLElement 的类 Counter,并实现内部的 HTML 和相关的事件处理函数:

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

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

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

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

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

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

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

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

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

  -- ------
  ------ --- -------------------- -
    ------ ----------
  -
-
展开代码

在上面的代码中,我们定义了一个 Counter 类,实现了相关的 HTML 和事件处理代码。构造函数中,我们创建了一个 h2 元素,用于显示计数值,以及两个按钮,用于操作计数值。同时,我们为两个按钮添加了点击事件处理函数,用于自增或自减计数值。

在自增或自减计数值时,我们使用了 Counter 类中定义的 getter 和 setter 方法。getter 方法用于获取 value 属性的值,setter 方法用于设置 value 属性,并同时更新计数器的内部 HTML。

同时,我们还定义了生命周期回调,用于在元素插入到 DOM 中、属性变化和元素移除时打印一些日志。

最后,我们还定义了一个 observedAttributes 的静态方法,用于确定监视哪些属性的变化。这样,每当 value 属性发生变化时,attributeChangedCallback 方法就会被调用。

注册自定义元素

定义 Count 类之后,我们需要通过 window.customElements.define 方法来将它注册为自定义元素:

上面的代码中,我们使用 my-counter 标签名来注册 Counter 类,这样我们就可以在 HTML 中使用 <my-counter> 标签来使用这个自定义元素了。

使用自定义元素

使用自定义元素和普通的 HTML 元素是一样的。我们只需要在 HTML 中使用 <my-counter> 标签就可以了。

然后我们就可以在 JavaScript 中使用这个自定义元素了:

当我们点击按钮时,计数值就会发生变化,输出的值也会相应地变化。

结语

Custom Elements API 是现代浏览器中一个非常强大的 API,可以帮助我们更好地构建组件化的 Web 应用。使用 Custom Elements 能够提高应用的可维护性和复用性,同时也可以让开发者更加关注应用本身的业务逻辑,而不需要过多地关注 UI 的实现细节。

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

纠错
反馈

纠错反馈