在 Vue2 中,组件与组件之间的通信可以通过以下几种方式来实现:

  1. Props 和 Events

这是 Vue2 中最基础和常用的父子组件通信方式。父组件通过属性传递数据给子组件,子组件通过事件触发向父组件传递数据。

父组件传递数据到子组件:

<template>
<div>
<child-component :message="message"></child-component>
</div>
</template> <script>
import ChildComponent from './ChildComponent.vue'; export default {
components: {
ChildComponent
},
data() {
return {
message: 'Hello, World!'
}
}
}
</script>

子组件接收父组件传递的数据

<template>
<div>{{ message }}</div>
</template> <script>
export default {
props: {
message: String
}
}
</script>

子组件向父组件传递数据:

<template>
<div>
<button @click="$emit('update-message', 'Hello, Vue!')">Update Message</button>
</div>
</template>

父组件监听子组件触发的事件:

<template>
<div>
<child-component @update-message="onMessageUpdated"></child-component>
</div>
</template> <script>
import ChildComponent from './ChildComponent.vue'; export default {
components: {
ChildComponent
},
methods: {
onMessageUpdated(message) {
console.log(message);
}
}
}
</script>
  1. $parent 和 $children

在 Vue2 中,每个组件实例都有 $parent$children 属性,可以用来访问组件的父组件和子组件实例。

父组件可以通过 $children 访问子组件:

<template>
<div>
<child-component></child-component>
</div>
</template> <script>
import ChildComponent from './ChildComponent.vue'; export default {
components: {
ChildComponent
},
mounted() {
console.log(this.$children[0].message);
}
}
</script>

子组件可以通过 $parent 访问父组件:

<template>
<div>{{ $parent.message }}</div>
</template> <script>
export default {
mounted() {
console.log(this.$parent.message);
}
}
</script>
  1. $refs

在 Vue2 中,可以使用 $refs 来访问组件的引用。可以通过 $refs 访问组件实例的方法和属性,也可以通过 $refs 传递数据。

<template>
<div>
<child-component ref="childComponent"></child-component>
<button @click="updateMessage">Update Message</button>
</div>
</template> <script>
import ChildComponent from './ChildComponent.vue'; export default {
components: {
ChildComponent
},
methods: {
updateMessage() {
this.$refs.childComponent.updateMessage('Hello, Vue!');
}
}
}
</script>
<template>
<div>{{ message }}</div>
</template> <script>
export default {
data() {
return {
message:'Hello, World!' }

  },

   methods: {

    updateMessage(message) { this.message = message;}

  }

 }

</script>


4. Event Bus 在 Vue2 中,可以使用事件总线来实现任意组件之间的通信。事件总线本质上是一个空的 Vue 实例,用来作为中央事件总线,任意组件都可以监听事件和触发事件。 创建事件总线:

```javascript
// EventBus.js
import Vue from 'vue';
export const EventBus = new Vue(); <template>
<div>
<button @click="updateMessage">Update Message</button>
</div>
</template> <script>
import { EventBus } from './EventBus.js'; export default {
methods: {
updateMessage() {
EventBus.$emit('update-message', 'Hello, Vue!');
}
}
}
</script>

组件之间传递数据:

<template>
<div>
<button @click="updateMessage">Update Message</button>
</div>
</template> <script>
import { EventBus } from './EventBus.js'; export default {
methods: {
updateMessage() {
EventBus.$emit('update-message', 'Hello, Vue!');
}
}
}
</script>

组件接收数据:

<template>
<div>{{ message }}</div>
</template> <script>
import { EventBus } from './EventBus.js'; export default {
data() {
return {
message: 'Hello, World!'
}
},
mounted() {
EventBus.$on('update-message', message => {
this.message = message;
});
}
}
</script>
  1. Vuex

如果组件之间的通信比较复杂,或者需要在多个组件之间共享数据,可以使用 Vuex。Vuex 是一个专门为 Vue.js 应用程序开发的状态管理模式,它集中管理组件之间共享的数据。

创建 store:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex); export const store = new Vuex.Store({
state: {
message: 'Hello, World!'
},
mutations: {
updateMessage(state, message) {
state.message = message;
}
},
actions: {
updateMessage(context, message) {
context.commit('updateMessage', message);
}
}
});

在组件中访问 store 中的数据:

<template>
<div>{{ message }}</div>
</template> <script>
import { mapState } from 'vuex'; export default {
computed: {
...mapState(['message'])
}
}
</script>

在组件中触发 action:

<template>
<div>
<button @click="updateMessage">Update Message</button>
</div>
</template> <script>
import { mapActions } from 'vuex'; export default {
methods: {
...mapActions(['updateMessage'])
}
}
</script>

更多关于 Vuex 的内容可以参考官方文档:https://vuex.vuejs.org/zh/

 

vue全家桶进阶之路17:组件与组件间的通信的更多相关文章

  1. Vue全家桶之组件化开发

    Vue全家桶之组件化开发   一.组件 组件 (Component) 是 Vue.js 最强大的功能之一 组件可以扩展 HTML 元素,封装可重用的代码   二. 组件注册 2.1 全局注册 Vue. ...

  2. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  3. 升级vue全家桶过程记录

    背景 如果你使用了element-ui的el-tabs组件,并且想要单独升级element-ui至2.10.0,你会发现,使用了el-tabs组件的页面只要打开就卡死.原因是element-ui~2. ...

  4. vue证明题一,vue全家桶的构成

    简单说下vue的构成,当然是简单为主,网上这东西满天飞,简单说几句就ok 1.vue是什么 vue读作view,是一种js框架.只关注于视图层,操作内容包括js,html,css 2.vue全家桶是什 ...

  5. Vue全家桶

    简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...

  6. 从零开始系列之vue全家桶(3)安装使用vuex

    什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...

  7. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  8. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...

  9. Vue全家桶介绍

    一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...

  10. 一个简单的假vue全家桶(vue+vue-router+require)

    首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...

随机推荐

  1. CentOS /RHEL 系统更新安全补丁的方法

    在 Linux 系统上,其中一个最重要的需求就是保持定期更新最新的安全补丁,或者为相应的 Linux 版本更新可用的安全补丁.在这篇文章中,我们将分享如何在 CentOS/RHEL 7/6 版本中设置 ...

  2. Python学习笔记--高阶技巧

    闭包(避免全局变量被修改的风险) 函数的嵌套的利用 若是只是调用到外部函数的值,只需要用到函数的嵌套,具体实现如下: 若是要对外部函数的值进行修改,需要用到nonlocal关键字,具体实现如下: at ...

  3. Activiti7开发(一)

    0.前言 开发背景 项目开发设计审批工作流,企业微信的审批不错,但是下拉列表不支持后期添加,所以只能自己实现,通过gitee查找相关工作流的开源项目,参考有 闲鹿(RuoYi+Activiti6) h ...

  4. 10.4 提高叠加处理速度(2) (harib07d)

    ps:能力有限,若有错误及纰漏欢迎指正.交流 sheet_refreshsub void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, ...

  5. 火山引擎 DataLeap:一家企业,数据体系要怎么搭建?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 导读:经过十多年的发展,数据治理在传统行业以及新兴互联网公司都已经产生落地实践.字节跳动也在探索一种分布式的数据治 ...

  6. 万字血书Vue—Vue语法

    模板语法 插值语法 Mustache插值采用{{ }},用于解析标签体内容,将Vue实例中的数据插入DOM中 <h1>Hello {{name}}</h1> 指令语法 指令用于 ...

  7. Java 编程入门第一课:HelloWorld

    在之前的文章中,壹哥带大家搭建出了 Java 的开发环境,配置了 JDK 环境变量,并且我们也熟悉了 dos 命令行的操作.那么从这篇文章开始,壹哥就开始带各位真正地学习 Java 代码该怎么写. - ...

  8. java顺序结构

    java顺序结构 java的基本结构就是顺序结构,一句一句执行 package charpter2; public class ShunXu { public static void main(Str ...

  9. 基于DPDK抓包的Suricata安装部署

    一.背景 Suricata支持网卡在线抓包和离线读取PCAP包两种形式的抓包: 离线抓包天然具有速度慢.非实时的特点 在线捕获数据包又包括常规网卡抓包.PF_RING和DPDK的方式 由于项目分光的流 ...

  10. 记一次 .NET 某医疗住院系统 崩溃分析

    一:背景 1. 讲故事 最近收到了两起程序崩溃的dump,查了下都是经典的 double free 造成的,蛮有意思,这里就抽一篇出来分享一下经验供后面的学习者避坑吧. 二:WinDbg 分析 1. ...