Vue 深入浅出 (六):组件通信

阅读时长 7 min read

在 Vue 中,组件通信是一个非常重要的概念。当我们构建一个大型的 Vue 应用程序时,通常会有多个组件之间需要进行数据交互和通信。Vue 提供了多种方法来实现组件通信,本文将为大家介绍这些方法并提供示例代码。

父子组件通信

在 Vue 中,父子组件之间的通信是最常见的场景。父组件可以通过 props 属性将数据传递给子组件,子组件可以通过 $emit 方法将事件传递给父组件。

props

props 是一个用于接收父组件数据的数组,每个元素表示一个 prop,其中包含了 prop 的名称、类型、默认值等信息。父组件可以将数据通过 props 传递给子组件,子组件则可以通过 this.props 访问这些数据。

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

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

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

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

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

在上面的示例中,父组件通过 props 将 name 和 age 数据传递给子组件,子组件则通过 props 接收这些数据并进行展示。

$emit

$emit 是一个用于触发事件的方法,它可以向父组件发送自定义事件,并可以传递参数。父组件可以通过 v-on 指令监听这些事件,并在事件处理函数中获取参数。

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

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

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

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

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

在上面的示例中,子组件通过 $emit 方法触发了一个名为 sayHello 的自定义事件,并传递了一个参数。父组件则通过 v-on 指令监听了这个事件,并在事件处理函数中获取了这个参数。

兄弟组件通信

在 Vue 中,兄弟组件之间的通信通常需要通过共同的父组件来实现。父组件可以通过 props 将数据传递给子组件,子组件可以通过 $emit 方法将事件传递给父组件,父组件再将数据通过 props 传递给另一个子组件。

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

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

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

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

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

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

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

在上面的示例中,父组件通过 props 将 name 数据传递给了子组件 1,子组件 1 通过 $emit 方法将事件传递给了父组件,父组件再将数据通过 props 传递给了子组件 2,最终子组件 2 展示了这个数据。

跨级组件通信

在 Vue 中,跨级组件之间的通信通常需要通过 provide/inject 或事件总线来实现。

provide/inject

provide/inject 是一种用于跨级组件通信的高级特性,它可以在祖先组件中提供数据,然后在后代组件中注入这些数据。

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

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

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

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

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

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

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

在上面的示例中,祖先组件通过 provide 方法提供了一个名为 name 的数据,后代组件通过 inject 属性注入了这个数据,然后就可以在组件中访问这个数据了。

事件总线

事件总线是一种用于跨级组件通信的简单方法,它可以在任何组件中触发事件,并可以在其他组件中监听这些事件。

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

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

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

在上面的示例中,事件总线是一个新创建的 Vue 实例,它可以在任何组件中触发事件,并可以在其他组件中监听这些事件。组件 A 在点击事件中触发了一个名为 eventA 的事件,并传递了一个参数。组件 B 则在 created 生命周期中监听了这个事件,并在事件处理函数中获取了这个参数。

Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d8788ca941bf7134ef1798

Feed
back