Vue.js 中组件通信的三种方式详解

Vue.js 是当前非常流行的前端框架之一,它提供了良好的组件化开发支持,使得将一个复杂的应用拆分成多个组件来实现变得非常简单。但是组件之间的通信却是一个需要谨慎处理的问题,本文将介绍 Vue.js 中组件通信的三种方式,并探讨它们的使用场景以及优缺点。

1. 父子组件通信:props 和 emit

父组件向子组件传递数据可以使用 props,子组件向父组件传递数据可以使用 emit。这是 Vue.js 最基础的组件通信方式。

1.1 props

props 是将数据传递到子组件的最简单的方式,例如:

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

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

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

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

这里使用 propsparentMsg 数据传递到了 child-component 中,并在子组件中使用 {{ msg }} 显示该数据。

1.2 emit

emit 是将数据从子组件传递到父组件的方式,例如:

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

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

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

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

这里使用 emit 将数据从 child-component 中传递到 parent-component,并在父组件中使用 handleSendData 方法接收该数据。

2. 非父子组件通信:$emit 和 $on

除了父子组件之间的通信,如果需要在没有父子关系的组件之间进行通信,可以使用 $emit$on

2.1 $emit

$emit 是将数据从一个组件中传递到它的父组件,但不是直接父组件,而是触发事件的组件的父组件。

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

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

这里使用 $emit 将数据从触发事件的组件传递到了它的父组件,并通过 send-data 事件触发:

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

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

在父组件中使用 $on 监听 send-data 事件,并在回调函数中接收数据。

2.2 $emit 和 $on

如果两个非父子关系的组件需要相互通信,可以使用 $emit$on

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

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

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

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

这里两个组件都使用了 $on 监听 send-data 事件,并在接收到数据时更新自己的 msg。当组件 A 的 handleClick 被调用时,它使用 $emit 将数据 'Hello, component B!' 发送给组件 B;组件 B 同理。

3. Vuex 状态共享

如果组件之间存在比较复杂的状态共享情况,可以考虑使用 Vuex。Vuex 是 Vue.js 的状态管理库,它实现了一个单向数据流,在全局共享一个数据仓库。

例如:

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

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

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

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

这里定义了一个名为 msg 的状态,并提供了 updateMsg 的 mutation,msgUpdate 的 action 和 getMsg 的 getter。

在任意组件中都可以使用 this.$store 来访问该仓库,并通过 this.$store.commit('updateMsg', 'Hello, Vuex!') 更新状态,通过 this.$store.getters.getMsg 获取状态。

总结

本文介绍了 Vue.js 中组件通信的三种方式:父子组件通信(props 和 emit)、非父子组件通信($emit 和 $on)、Vuex 状态共享。在实际开发中,需要根据不同的场景选择合适的方式来完成组件之间的通信。

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


猜你喜欢

  • 解决在 Node.js 中使用 body-parser 出现 invalid json 问题

    在 Node.js 中开发 Web 服务器时,我们通常会使用许多第三方库来简化开发流程。其中一个很常用的库就是 body-parser,它能够解析来自客户端的 HTTP 请求体,并将其转化为 JSON...

    1 年前
  • LESS 中处理文本位置的技巧

    在前端开发中,文本的位置布局是非常重要的一部分,而 LESS 的强大功能也为我们提供了很多方便的方法来实现这一目标。在这篇文章中,我们将着重介绍 LESS 中处理文本位置的技巧,希望能够帮助大家更好地...

    1 年前
  • 如何在 Deno 中使用 GraphQL 进行 API 开发

    Deno 是一个新颖的 JavaScript/TypeScript 运行时环境,它的目的是提供一个安全的环境来运行 JavaScript/TypeScript 代码。

    1 年前
  • MongoDB 中的数据类型详解及使用方法

    MongoDB 是一个流行的 NoSQL 数据库,它与传统的关系型数据库有所不同,包括在数据类型上。在本文中,我们将深入了解 MongoDB 中的各种数据类型,以及它们的使用方法和指导意义。

    1 年前
  • React SPA 应用中如何实现 Code Splitting

    在前端开发中,构建快速、高效的应用程序是非常重要的。当单个页面变得庞大而臃肿时,应用性能也会受到影响。Code Splitting(代码分割)作为一种前端优化技术,可以将应用程序拆分成多个小模块,以获...

    1 年前
  • Webpack 模板文件动态生成方法详解

    在前端开发中,Webpack 成为了越来越流行的构建工具。在 Webpack 中,模板文件是一个非常常见的文件类型。模板文件通常包含常见的 HTML 结构、CSS 样式和 JS 代码,如果我们能够在模...

    1 年前
  • 使用 PWA 技术为你的网站提供更好的可访问性

    在现代 web 应用的开发中,PWA 技术已经成为了一个非常热门的话题。PWA,即 Progressive Web Apps,是一种使 web 应用具备类似原生应用的交互体验的技术。

    1 年前
  • 使用 SSE 和 Redis 实现分布式消息队列

    在现代 Web 应用程序中,实时通信对于处理数据流和事件驱动的架构非常重要。为了解决这个问题,大多数应用都会实现 WebSocket 或者 轮询机制。然而,这些机制存在的缺陷包括网络流量大,带宽浪费等...

    1 年前
  • # Cypress 测试框架中的表单验证处理

    Cypress 测试框架中的表单验证处理 在应用程序开发中,表单验证是不可或缺的部分。表单验证可以保证用户输入的数据合法,并帮助我们捕捉和解决一些潜在的问题。Cypress1.0 测试框架提供了一套强...

    1 年前
  • SASS 中自定义函数中的默认值及附加参数使用方法

    介绍 SASS 是一种 CSS 的预编译语言,它允许开发者使用基于变量、嵌套、Mixin 和函数的语法来更加高效地编写 CSS。其中,函数是 SASS 提供的一个可以进行自定义的技术特性,使用函数可以...

    1 年前
  • 在 ES8 中使用 async/await 处理多个并行请求的方法

    在 ES8 中使用 async/await 处理多个并行请求的方法 在开发 Web 应用程序时,异步请求是必不可少的部分。异步请求可以使用户界面保持响应并为用户提供更好的用户体验。

    1 年前
  • PM2 错误处理的常见问题及解决方案

    前言 在前端开发中,我们通常需要使用 PM2 进行进程管理和服务器部署。但是,在使用 PM2 过程中,我们也会遇到各种各样的错误问题。本文将会总结 PM2 错误处理的常见问题及解决方案,并提供详细的学...

    1 年前
  • Docker Swarm 模式的使用指南

    在现代化的开发环境下,Docker 已经成为了开发者中十分流行的工具。随着应用的不断增长,需要管理大量的 Docker 容器。这时候,Docker Swarm 就可以派上用场了。

    1 年前
  • TypeScript 的 JSX 表单组件

    前端开发中,表单组件是经常用到的一种组件。但是,在使用表单组件时,经常会遇到一些问题,比如表单验证、提交数据处理等。在 TypeScript 中使用 JSX 进行表单组件的开发,可以大大简化这些问题的...

    1 年前
  • Kubernetes 使用 Fluentd 和 Elasticsearch 搭建日志监控系统

    随着互联网应用规模的不断增大和数据复杂度的增加,日志监控已经成为系统监控的一个非常重要的环节。本篇文章就将带领大家使用 Kubernetes 集群中 Fluentd 和 Elasticsearch 搭...

    1 年前
  • Jest 测试中的断言技术解析

    对于前端开发者来说,在繁琐的开发过程中,代码的质量和稳健性至关重要。而在这个过程中,自动化测试是不可或缺的一部分。 Jest 是一个流行的测试框架,它提供了一套强大的工具来使测试流程自动化,并且可以帮...

    1 年前
  • RxJS 中的 Observable 包装类的讲解

    RxJS 是一款非常流行的函数式编程库,它提供了一组强大的工具来处理异步数据流。其中,Observable 是 RxJS 最核心的概念之一,它是一个能够表示任何类型的数据流并进行操作的类。

    1 年前
  • Sequelize 中如何实现联合查询

    在开发 Web 应用程序时,使用 Sequelize 进行数据存取操作是一个很常见的做法。Sequelize 是一个基于 Node.js 的 ORM(对象关系映射)框架,它可以让开发者更加方便地进行数...

    1 年前
  • Mongoose 使用 Promise 方法优化数据库操作

    如果你是一个前端开发者,你可能经常使用 Mongoose 以及 MongoDB 进行数据库操作。但是,使用回调方法进行异步操作可能会导致代码难以维护,同时也会增加调试的难度。

    1 年前
  • 如何用 Babel 编译 Vue 项目中的 TypeScript 文件?

    随着 Vue 和 TypeScript 在前端技术栈中的普及,我们需要使用 TypeScript 编写 Vue 项目来提高开发效率和代码可维护性。然而,由于浏览器无法直接理解 TypeScript,我...

    1 年前

相关推荐

    暂无文章