Vue.js 中组件通信的 6 种方式

Vue.js 是一款流行的 JavaScript 框架,它采用组件化的方式进行开发。在一个大型的 Web 应用程序中,可能会有很多个组件需要相互通信,而在 Vue.js 中,有 6 种不同的方式可以实现组件通信。本文将介绍这 6 种方式,并提供详细的示例代码。

1. 父子组件通信

在 Vue.js 中,父组件可以向子组件传递数据,同时子组件可以向父组件发送消息。父子组件通信的方式有以下两种:

使用 Props

Props 是 Vue.js 中一个非常重要的概念,它表示父组件向子组件传递数据。通过在子组件中定义 Props,父组件就可以向子组件传递数据了。下面是一个使用 Props 进行父子组件通信的示例:

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

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

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

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

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

在上面的示例中,父组件向子组件传递了一个名为 message 的字符串变量。这个变量被子组件中定义的 Props 接收到,并渲染在视图中。

使用 $emit

在 Vue.js 中,子组件可以通过 $emit 方法向父组件发送消息。当子组件需要在某个事件发生后通知父组件时,就可以使用 $emit 方法。

下面是一个使用 $emit 方法进行父子组件通信的示例:

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

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

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

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

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

在上面的示例中,子组件中定义了一个 emitEvent 方法,当用户点击子组件时,该方法会触发 $emit 方法,向父组件发送 my-event 消息。

2. 兄弟组件通信

如果两个组件之间没有父子关系,它们也需要相互通信,这时就需要使用一些其他的方式了。下面是两种常见的兄弟组件通信方式:

使用中央事件总线

中央事件总线是一种非常简单、易于实现的兄弟组件通信方式,它需要一个单独的事件通道来维护组件之间的通信关系。下面是一个使用中央事件总线进行兄弟组件通信的示例:

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

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

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

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

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

在上面的示例中,我们先创建了一个 EventBus 实例,然后通过 $emit 方法来触发 my-event 事件,并在另一个组件中通过 $on 方法监听 my-event 事件,以响应该事件。

使用 Vuex

Vuex 是 Vue.js 的官方状态管理库,它可以用于管理全局状态,并且可以让组件之间相互通信。通过 Vuex,我们可以将应用程序的状态从组件中抽离出来,并将它存储在一个专门的状态容器中。下面是一个使用 Vuex 进行兄弟组件通信的示例:

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

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

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

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

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

在上面的示例中,我们先创建了一个 Vuex Store,然后在组件中使用 $store.commit 方法来触发 mutations,从而修改组件的状态。组件中也可以使用计算属性来访问 Store 中的状态。

3. 跨级组件通信

在 Vue.js 中,跨级组件通信是一件比较困难的事情,因为 Vue.js 中父组件不能直接访问子组件的 Props,而子组件也不能直接访问父组件的状态。下面是两种常见的跨级组件通信方式:

使用 provide 和 inject

在 Vue.js 中,父组件可以通过 provide 方法向它的所有子孙组件注入一个数据对象,子孙组件可以通过 inject 方法访问这个数据对象。这种方式不太符合 Vue.js 的 Reactivity 响应式原则,所以在实际场景中慎用。

下面是一个使用 provide 和 inject 进行跨级组件通信的示例:

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

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

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

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

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

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

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

在上面的示例中,我们使用 provide 方法在 GrandParent 组件中向所有的子孙组件注入了一个名为 message 的字符串变量。然后在 Parent 和 Child 组件中分别通过 inject 方法注入 message 变量,以访问它。

使用事件总线

事件总线也可以用于跨级组件通信,它是一种全局的事件通道,通过它可以在任何组件中监听和触发事件。和兄弟组件通信时一样,这种方式也不太符合 Vue.js 的 Reactivity 响应式原则。

下面是一个使用事件总线进行跨级组件通信的示例:

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

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

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

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

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

在上面的示例中,我们使用了自定义事件 my-event,并在 Parent 组件中通过 $on 来监听事件,然后在 Child 组件中通过 $emit 来触发该事件。

总结

本文介绍了 Vue.js 中 6 种不同的组件通信方式,涵盖了大部分场景。在实际使用中,我们需要根据不同的业务需求,选择合适的通信方式来实现组件之间的通信。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/646ffddb968c7c53b0e27bad


猜你喜欢

  • ES10 在非浏览器环境下的全新用法

    在前端技术的发展中,ECMAScript 是一个不可忽略的角色,随着 ECMAScript 的版本不断更新,前端开发变得越来越方便和高效。ES10(ECMAScript 2019)是 ECMAScri...

    1 年前
  • 在 react+webpack 项目中使用 eslint 进行代码规范检查

    在 React+Webpack 项目中使用 ESLint 进行代码规范检查 前言 随着前端技术的不断升级,现代化前端开发已经离不开模块化、自动化、组件化的开发方式,而随着项目规模和开发人员数量的不断增...

    1 年前
  • RxJS 中的 Filter 操作符

    RxJS 是一种强大的响应式编程库,它使我们能够以具有可预测性的函数式方式处理事件流。这可以帮助我们处理复杂的异步流操作,以及处理非阻塞的用户界面和网络请求。 Filter 操作符是 RxJS 中最常...

    1 年前
  • Mongoose 如何进行数据的自动更新与创建?

    前言 Mongoose 是 Node.js 中广受欢迎的 MongoDB 官方 Node.js 驱动的优势补充,它提供了一种在 Node.js 中使用 MongoDB 数据库的简单而可靠的方式,适用于...

    1 年前
  • Headless CMS 适用于哪些应用场景?

    随着移动设备和人工智能等技术的飞速发展,使得 Web 开发中涉及到的内容变得越来越复杂。在这种情况下,Headless CMS 的概念应运而生。Headless CMS 使得 Web 开发更加简单和灵...

    1 年前
  • 如何利用 Media Queries 实现响应式设计的文字排版

    在当今的移动互联网时代,越来越多的用户使用不同的设备访问网站,这就需要我们开发响应式的网站来适应不同的屏幕大小和设备。其中,文字排版对于响应式设计是非常重要的一部分。

    1 年前
  • 如何在 LESS 中使用 autoprefixer 插件?

    在现代 web 开发中,前端开发人员需要为不同的浏览器针对样式做出多种兼容性处理。为了减少这些冗长且重复的代码,我们可以使用 autoprefixer 插件。 autoprefixer 是一个 LES...

    1 年前
  • 在 Redux 中使用多个 Reducer

    在 Redux 中使用多个 Reducer Redux 是一个 JavaScript 状态容器,用于管理 Web 应用程序中的数据流,也是现今 Web 开发中最受欢迎的框架之一。

    1 年前
  • 使用 Socket.IO 构建实时任务分配系统的详细指南

    在现代网站和应用程序中,实时性已成为一个基本的需求。而在这种情况下,Socket.IO 可能是最佳的工具之一。Socket.IO 是一个基于 Node.js 的 JavaScript 库,提供了一个简...

    1 年前
  • Webpack 如何解决模块循环依赖?

    前端开发中,模块循环依赖是一种经常会遇到的问题。比如说,在开发一个复杂的业务组件时,会引用其他组件或工具库中的模块,而这些模块又会依赖于当前组件中的某些模块,这就形成了循环依赖。

    1 年前
  • Cypress 测试遇到超时问题怎么办?

    前言 Cypress 是一个流行的前端测试框架,它提供了简单易用的 API 和关注点分离的测试结构。但是,我们在使用 Cypress 进行测试时,经常会遇到超时问题。

    1 年前
  • 学习 CSS Flexbox 布局需要掌握的内容

    如果你正在学习前端开发,那么 CSS Flexbox 布局是你必须掌握的重要技能之一。而要学习这种布局方式,你需要掌握以下内容: 1. 弹性容器(Flex Container) Flex Contai...

    1 年前
  • 使用 Node.js 和 Express.js 构建用户管理系统

    前言:现在,Web 前端开发已成为一个非常热门的职业,对于 Web 开发人员来说,学习和掌握 Node.js 是一项重要的技能。本文将介绍如何使用 Node.js 和 Express.js 构建一个用...

    1 年前
  • 使用 Express.js 构建基于 websocket 的实时聊天应用

    前端界面已经成为了我们生活和工作的重要组成部分。为了给用户提供更好的交互体验,实时聊天已经成为了不可或缺的一部分。而 websocket 技术,则是实现实时聊天的主要方式之一。

    1 年前
  • CSS Grid 如何搭配媒体查询实现网页适配

    在网页设计中,我们经常需要考虑不同设备尺寸的适配问题。而 CSS Grid 是一个非常强大的布局工具,它可以帮助我们轻松地实现网页的布局。本文将介绍如何搭配媒体查询,利用 CSS Grid 实现网页的...

    1 年前
  • Redis 常见问题及解决方案

    介绍 Redis 是一个基于内存的开源键值存储系统,可以用作数据库、缓存和消息中间件等。由于其高速读写能力和易于扩展的特性,Redis 在 Web 应用开发中广泛应用。

    1 年前
  • XMLHttpRequest 如何与 Promise 结合使用?

    简介 XMLHttpRequest (XHR) 是 JavaScript 中用于发送 HTTP 请求和接收服务器端响应的 API。Promise 是 JavaScript 中一种优雅的异步编程解决方案...

    1 年前
  • MongoDB 的并发与锁定问题及解决方法

    前言 在前端开发中,数据库是必不可少的部分。MongoDB 是一个非关系型数据库,被广泛用于 Web 应用、游戏、社交媒体等方面。但是,MongoDB 的并发和锁定问题可能会影响其性能。

    1 年前
  • 使用 Mocha 测试 TypeScript 项目

    简介 在开发前端项目时,我们经常需要进行测试以确保代码的质量和正确性。Mocha 是一个流行的 JavaScript 测试框架,它支持异步测试和多种报告格式,可以用于前端和后端项目。

    1 年前
  • Vue SPA 项目开发之 axios 解决 IE 下 axios 的兼容问题

    在 Vue 单页面应用(SPA)的项目开发中,使用 axios 是必不可少的。它是一个基于 promise 的 HTTP 库,可以方便地发送 HTTP 请求,并且支持多种请求方式和拦截器。

    1 年前

相关推荐

    暂无文章