Vue.js 中如何使用 provide/inject 实现组件跨层级通信

阅读时长 4 分钟读完

在 Vue.js 中,组件是构建应用程序的基本单元。我们可能会遇到不同层级之间需要进行通信的情况。Vue.js 提供了 provideinject 这两个 API 帮助我们实现组件间的跨层级通信。

provide/inject 的基本用法

provideinject 是成对出现的,它们的使用方式如下:

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

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

provide 可以提供任何 JavaScript 类型的数据作为值,并且在每个子组件中,通过 inject 注入 provide 对象中提供的数据。

组件跨层级通信例子

下面我们通过一个案例来详细介绍 provideinject 的使用方式。

我们有一个 App.vue 组件作为根组件,包含了 Header.vueFooter.vue 两个子组件。现在我们需要在 Footer.vue 中获取到 Header.vue 组件中的数据。

我们可以在 Header.vue 组件中通过 provide 提供数据,在 Footer.vue 中通过 inject 获取数据。代码如下:

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

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

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

最后,在 App.vue 中引入这两个子组件:

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

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

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

这个例子中,我们在 Header.vue 中通过 provide 提供了一个名为 message 的数据,同时在 Footer.vue 中通过 inject 获取了这个数据,并将它作为 headerMessage 的值返回。

这样我们就成功地实现了跨层级组件的通信。

提示和注意事项

  • 如果使用 TypeScript,可以使用 @Provide@Inject 装饰器实现。
  • provideinject 并不是反应式的,意味着如果被提供的值发生了变化,子组件并不会更新。
  • 如果一些组件在同一个 provide 中提供相同的 key,则在子组件中,最近的父组件提供的值将会被使用。

总结

在 Vue.js 中,provideinject API 是跨层级组件通信的有效方式。

我们可以使用 provide 在父层级组件中提供数据,并使用 inject 在子层级组件中获取数据。

使用 provideinject 需要注意一些细节,但是它们提供了一种简单而灵活的方式,帮助我们更好地构建组件间的友好通信。

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

纠错
反馈