使用 Custom Elements 构建通用的 Web Components

阅读时长 14 分钟读完

介绍

Web Components 是一种用于创建可重用的自定义元素的技术。Custom Elements 是 Web Components 的一部分,它使得我们能够创建新的 HTML 元素并在多个应用程序和页面上共享它们。

Custom Elements 的目的就是将 HTML 实现组件化,让组件的使用和封装变得更加简单、易于维护。在此过程中,我们需要关注一些细节问题,如命名规范、全局状态等,本文将会提供详细的指导。

本文将首先介绍 Custom Elements 的基础概念,然后根据需求情况,提供通用的 Web Components 的实现方案,最后讨论如何在 Vue、React 等框架中使用 Web Components。

基础概念

Custom Elements 是指通过编写 JavaScript 代码创建一组自定义标签,在 Web 应用中使用它们可以简化代码的编写和维护。一个组件由以下几部分组成:

  • 元素名:组件的元素名称,需要满足自定义元素规范,即包含一个短横线,如 my-element。
  • Shadow DOM 树:组件内部的 DOM 结构,没有被页面中其它部分的样式和脚本修改的能力。
  • Attributes 定义:定义组件的属性,主要用于传递数据和响应属性变化。
  • 生命周期钩子:用于自定义元素的属性更改、捆绑和卸载。
  • 方法和事件:组件内部的自定义方法和事件,用于与外部交互。

构建通用的 Web Components

在构建通用的 Web Components 时,我们需要注意如下几点:

命名规范

为了确保代码的可重用性,元素名称应该足够独特、具有语义和可读性。

例如,若我们要创建一个叫做“评分星级”的元素,则其名称应该为“star-rating”。

封装样式

为了避免 CSS 样式的全局污染,我们使用 Shadow DOM 树来封装样式。

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

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

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

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

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

构建属性

属性允许外部传入数据,并根据属性的变化执行相应的操作。

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

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

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

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

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

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

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

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

生命周期钩子

生命周期钩子允许我们重载元素在各个阶段的方法,例如构造函数、属性更改方法、元素卸载方法等。

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

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

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

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

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

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

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

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

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

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

方法和事件

我们使用 CustomEvent 来绑定自定义事件,方便我们与自定义元素进行交互。

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

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

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

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

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

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

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

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

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

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

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

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

在框架中使用 Web Components

在框架中使用 Web Components 主要有两个问题需要解决:

  • 如何在框架中加载 Web Components?
  • 如何从 Web Components 与框架进行交互?

Vue 中使用 Web Components

在 Vue 中使用 Web Components 需要先进行 Web Components 的引入。在 main.js 中,我们需要引入一个 Web Components 的 polyfill,然后再全局注册 Web Components。

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

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

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

上述代码中,我们引入 Web Components 的 polyfill,并全局注册 star-rating 组件。在组件中,我们可以使用 CustomEvent 来与 Vue 进行交互。

React 中使用 Web Components

在 React 中使用 Web Components 需要在 JSX 中引入 Web Components,并使用 ref 来获取 Web Components 的实例。然后我们可以使用 ref.current 操作 Web Components,并在 Web Components 中使用 CustomEvent 和 React 进行交互。

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

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

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

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

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

结论

Custom Elements 是 Web Components 的一部分,它可以让我们按需加载自定义的 HTML 元素。在构建通用的 Web Components 时,我们需要关注元素的命名规范、样式封装、属性定义、生命周期钩子、方法和事件。同时,在框架中使用 Web Components 时,我们需要解决 Web Components 的加载和 Web Components 与框架的通信问题。

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

纠错
反馈