使用 Vue 构建可复用的关于 Custom Elements 的组件

阅读时长 7 分钟读完

在 Web 开发中,Custom Elements 是一个新的技术标准,它可以帮助开发者创建自定义组件,封装业务逻辑,提高代码复用率。在本文中,我们将介绍如何使用 Vue 来构建可复用的关于 Custom Elements 的组件,让你轻松享受到组件化开发的便捷性。

什么是 Custom Elements?

Custom Elements 是一项浏览器的新技术标准,它允许 Web 开发者定义自己的 HTML 标签,创建自定义组件。这样,在开发过程中可以封装业务逻辑,提高代码复用率。

一个 Custom Element 的定义由两个部分组成:

  • 标签名称(Custom Element 名称);
  • 定义如何渲染和交互的 JS 类。

在 Vue 中,我们可以使用 Vue CLI 提供的 @vue/cli-plugin-custom-elements 插件,方便地构建和使用 Custom Elements。

开始构建

创建项目

我们使用 Vue CLI 创建一个基础项目,并加入 @vue/cli-plugin-custom-elements 插件:

编写代码

我们以一个简单的计数器组件为例,来说明如何构建 Custom Elements。

首先,在 src 目录下创建一个 Count.vue 文件,编写计数器组件代码:

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

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

然后,在 main.js 文件中将 Count 组件转化为 Custom Element:

上述代码第一行引入了 Vue.js 库,第二行引入 @vue/web-component-wrapper 库,它用于将 Vue 组件转化为 Custom Element。接着,我们将 Count 组件(Vue 组件)传递给 wrap 函数,得到一个能够应用于 Custom Element 的新组件 CustomElement。最后,通过调用 window.customElements.define 函数,将自定义组件注册为一个 HTML 标签 my-count

使用组件

现在,我们已经成功创建了一个基于 Vue 的 Custom Element,那么在其他页面中我们要如何使用这个组件呢?

在页面中直接按照 HTML 标签的形式引用我们新建的 my-count 即可:

注意:由于我们在 window.customElements.define("my-count", CustomElement); 语句中定义了 my-count 标签,所以在 HTML 中引用组件时必须使用 my-count 标签。

深入理解

上面的例子已经能够演示如何创建和使用一个简单的 Custom Element,但是这个例子还存在一些问题。例如,我们现在只能在 Vue 中使用这个组件,不能在 React、Angular 或者其他框架中使用。接下来,我们将介绍如何让这个组件可以在任何框架中使用。

渲染方式

Custom Elements 支持两种方式渲染自定义组件:

  • 插槽投影;
  • Shadow DOM。

Vue 默认使用的是插槽投影,它可以让子组件渲染在父组件的固定位置。但是其他框架可能不支持插槽投影,因此我们需要改为使用 Shadow DOM。

在 Vue 中,我们可以使用 @vue/web-component-wrapper 库提供的 VueCustomElement 类来自定义组件的渲染方式:

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

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

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

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

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

如上例所示,我们把 Count 的渲染方式从插槽投影修改为了 Shadow DOM。我们使用 attachShadow 函数创建了一个 Shadow DOM 根节点,并将其赋值给 vueComponentshadowRoot 属性。

这样一来,我们就可以在任何支持 Custom Elements 的框架中使用这个组件了!

参数传递

在 Vue 组件中,通过 props 属性可以实现参数传递。但是,在 Custom Elements 中传递参数则是通过 HTML 属性(Element attribute) 来实现的。

下面是一个在 Vue 组件中定义并使用 props 的例子:

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

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

在 Custom Elements 中,我们需要通过 HTML 属性来传递相应的参数:

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

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

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

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

在这个例子中,我们将 msg 属性改成了一个 HTML 属性 msg,通过调用 getAttribute 方法,将其映射到了组件的 propsData 属性中。

总结

在本文中,我们介绍了如何使用 Vue 构建可复用的 Custom Elements 组件。我们先创建了一个基础的计数器组件,并通过 @vue/cli-plugin-custom-elements 插件将其转化为 Custom Element。接着,我们演示了如何在 HTML 页面中使用新建的组件。最后,我们深入讲解了如何使用 Shadow DOM 渲染 Vue 组件,以及传递参数的方式。

Custom Elements 开放了一个新的世界,能让我们更方便地实现组件化开发。使用 Custom Elements,你可以在不同的 Web 开发框架中共享和复用自定义组件。这种组件化开发的方式可以提高代码的可维护性和重用性,非常值得尝试和学习。

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

纠错
反馈