深入理解 Web Components

阅读时长 7 分钟读完

什么是 Web Components

Web Components 是一组技术,用于创建可重用而独立的组件,可以在任何网站上使用。它包括三个主要技术:Custom Elements(自定义元素)、Shadow DOM(影子 DOM),以及 HTML Templates(HTML 模板)。Web Components 的目的是解决困扰 web 开发者的一些问题,如在网站或单页应用中构建复杂的 UI 组件、为组件定义私有样式及业务逻辑、在多个项目中共享组件等。

Custom Elements

Custom Elements 允许开发者创建一种自定义元素,从而实现像原生 HTML 元素那样使用组件。自定义元素是由开发者自行编写的元素,可以被定义、注册、实例化和使用,就像原生 HTML 元素一样。

以下是创建自定义元素的基本语法:

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

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

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

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

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

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

我们通过继承 HTMLElement 创建自定义元素,然后定义该元素的各种生命周期方法(connectedCallback、disconnectedCallback 和 attributeChangedCallback),这些方法将在相应的生命周期事件发生时被调用。最后,使用 customElements.define() 方法将自定义元素注册为一个 HTML 元素,并为其指定名称。

Shadow DOM

Shadow DOM 允许开发者封装组件的样式和结构,从而使其私有化。除了一些不属于该组件的事件和样式之外,Shadow DOM 中的结构和样式不会影响到页面上的其他元素。这种隔离是通过创建一个 Shadow Root 实现的,这个 Shadow Root 是 Web Component 的一部分。

以下是创建 Shadow DOM 的基本语法:

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

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

我们首先创建一个 template 元素,并在其中定义组件的样式和结构。然后,使用 attachShadow() 方法创建一个 Shadow Root,并通过 shadow.appendChild() 方法将 template 元素的内容添加到 Shadow Root 中。这样,在页面上使用组件时,组件的样式和结构就会被封装在 Shadow Root 中。

HTML Templates

HTML Templates 可以帮助我们创建可重用的、自定义的标记,这些标记在自定义元素的 DOM 结构中使用。它提高了组件的重用性,并提供了一种更简单、更可读的方式来编写组件。

以下是 HTML Templates 的基本用法:

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

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

我们将组件的 HTML、CSS 和 JavaScript 代码放到一个 template 元素中,然后在自定义元素的构造器中获取 template 元素,并将其内容添加到 Shadow Root 中。

常见问题与解决方案

如何进行跨组件通信?

组件之间的通信又称为组件的协作。通常有两种方式:

  1. Props&Events

Props 是父组件传递给子组件的数据,Events 是子组件向父组件通信的方式。当父组件中的数据发生变化时,Props 会被更新,然后传递给子组件。当子组件中的某个操作需要通知父组件时,它可以通过触发自定义事件来通知父组件。

  1. Pub/Sub

Pub/Sub 是一种更加灵活和解耦的方式。Pub/Sub 系统将每个组件都视为一个独立的发布者和订阅者。可以通过 PUB、SUB 等事件来进行消息订阅和发布,从而让组件之间进行通信。

如何在 Web Components 中使用 Redux?

  1. 在自定义元素初始化的时候创建 Store。
  1. 在组件中使用 <provider>
-- -------------------- ---- -------
----- --------------- - -- -- -
  ----- ------- - --------------------------------------------
  ----------------- - -
      --------- ---------------------------
        ---------- -----------
      -------------
  -----------------------------------

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

我们使用 React 作为组件的渲染库,将 Provider 组件嵌套在自定义元素中,并将 store 作为参数传递给 Provider 组件。这样,我们就可以在组件中使用 connect 函数,从而获取 store 中的 state 和 dispatch。

总结

Web Components 技术不仅提高了组件的重用性,还提供了一种更加简单、可读性更高的方式来开发组件。在实际开发中,我们可以将 Web Components 技术与 React、Vue 等现有的大型框架结合,从而构建更加复杂、灵活的 web 应用程序。

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

纠错
反馈