Web Components 实例之组件通信(发布订阅模式)

阅读时长 6 分钟读完

在实际开发中,一个页面很少只包含一个组件,而是包含多个组件。不同的组件之间需要通过通信实现相互协作。而 Web Components 在这个方面的优势就在于其能源于浏览器原生的事件系统,并且可以支持所有的主流的事件传递方式。其中,发布-订阅模式是一种很好的设计模式,可以用于实现组件之间的通信。

发布-订阅模式

发布-订阅模式又叫做观察者模式(Observer Pattern),它定义了一种对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。在这种模式中,对象之间是松耦合的,能够实现对象间的解耦。

在 Web Components 中,我们可以通过自定义事件来实现发布-订阅模式。我们通过 dispatchEvent 方法来分发自己定义的事件,然后在多个组件中通过 addEventListener 方法来监听这个事件的发生。

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

在上述示例中,我们自定义了一个名为 customEvent 的事件,并设置了其中的 message 属性。然后在 CustomComp 组件中,通过 dispatchEvent 分发了一个自定义事件。而在其他组件中,通过 addEventListener 方法监听了 customEvent 事件,并在回调中打印出事件的全部属性。

事件代理

然而,当组件之间的嵌套非常多的时候,对于每一个组件都进行 dispatchEvent 和 addEventListener 的操作会使得整个系统变得复杂而且不易于维护。这时,我们可以采用事件代理的方法。(事件代理是利用事件的冒泡原理,只在父元素上注册事件,然后通过判断事件源来触发事件。)

我们可以将多个组件的通信需求统一放到一个中央事件总线中,这个总线只需要在整个应用中初始化一次,其他组件可以通过这个总线进行事件的分发和监听。我们可以通过全局变量或者静态方法来实现中央事件总线。

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

在上述示例中,我们创建了一个名为 EventCenter 的类,它包含了 dispatch 和 addListener 两个静态方法。其中 dispatch 方法用于分发事件,addListener 方法用于监听事件。我们在其中通过 CustomEvent 创建了自定义事件,并调用了 document 对象的 dispatchEvent 方法将事件分发出去。在 addListener 方法中,我们调用 document 对象的 addEventListener 方法并传入 eventName,当 EventCenter.dispatch 方法中的自定义事件被分发出去后,我们传入的回调函数就会被触发。

使用示例

下面给出一个主页-列表-详情的示例:

home.js

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

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

list.js

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

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

detail.js

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

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

我们在 HomeComp 中添加了一个按钮,并在其点击事件中分发了一个 to-list 自定义事件。在 ListComp 中和 DetailComp 中添加了对 to-list 事件的监听,并在回调函数中输出了事件的内容。

总结

以上是使用 Web Components 实现组件通信的一种常用方式,即使用发布-订阅模式。通过自定义事件实现多个组件之间的松耦合。我们也为大家提供了一个示例,供大家参考。希望这篇文章能够帮助大家更好地学习和使用 Web Components。

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

纠错
反馈