深入理解 Vue 3 组件通信
在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 props、emits、provide 和 inject、事件总线以及 Vuex 状态管理。
1. 使用 props 和 emits 进行父子组件通信
props 传递数据
props 是父组件向子组件传递数据的一种机制。在子组件中,通过定义 props 属性来接收父组件传递的数据。
父组件 (ParentComponent.vue):
<template>
<ChildComponent :message="parentMessage" />
</template> <script>
import ChildComponent from './ChildComponent.vue'; export default {
components: {
ChildComponent
},
data() {
return {
parentMessage: 'Hello from Parent Component!'
};
}
};
</script>
子组件 (ChildComponent.vue):
<template>
<div>{{ message }}</div>
</template> <script>
export default {
props: {
message: {
type: String,
required: true
}
}
};
</script>
emits 传递事件
子组件可以通过 $emit 方法向父组件发送事件,从而实现从子组件向父组件传递信息。
子组件 (ChildComponent.vue):
<template>
<button @click="sendMessage">Send Message</button>
</template> <script>
export default {
emits: ['messageSent'],
methods: {
sendMessage() {
this.$emit('messageSent', 'Hello from Child Component!');
}
}
};
</script>
父组件 (ParentComponent.vue):
<template>
<ChildComponent @messageSent="handleMessage" />
</template> <script>
import ChildComponent from './ChildComponent.vue'; export default {
components: {
ChildComponent
},
methods: {
handleMessage(message) {
console.log(message);
}
}
};
</script>
2. 使用 provide 和 inject 进行祖孙组件通信
provide 和 inject 允许祖父组件和孙组件之间进行通信,而不需要通过中间的父组件传递数据。
祖父组件 (GrandparentComponent.vue):
<template>
<ParentComponent />
</template> <script>
import ParentComponent from './ParentComponent.vue'; export default {
components: {
ParentComponent
},
provide() {
return {
grandparentMessage: 'Hello from Grandparent Component!'
};
}
};
</script>
孙组件 (GrandchildComponent.vue):
<template>
<div>{{ grandparentMessage }}</div>
</template> <script>
export default {
inject: ['grandparentMessage']
};
</script>
3. 使用事件总线进行兄弟组件通信
事件总线是一种常见的用于兄弟组件通信的方法,通常使用 Vue 实例作为事件总线。
事件总线 (eventBus.js):
import { reactive } from 'vue';
const eventBus = reactive({});
export default eventBus;
组件 A (ComponentA.vue):
<template>
<button @click="sendMessage">Send Message to Component B</button>
</template> <script>
import eventBus from './eventBus.js'; export default {
methods: {
sendMessage() {
eventBus.message = 'Hello from Component A!';
}
}
};
</script>
组件 B (ComponentB.vue):
<template>
<div>{{ message }}</div>
</template> <script>
import { reactive, toRefs } from 'vue';
import eventBus from './eventBus.js'; export default {
setup() {
const state = reactive({
message: ''
}); state.message = eventBus.message; return {
...toRefs(state)
};
}
};
</script>
深入理解 Vue 3 组件通信的更多相关文章
- Vue 兄弟组件通信(不使用Vuex)
Vue 兄弟组件通信(不使用Vuex) 项目中,我们经常会遇到兄弟组件通信的情况.在大型项目中我们可以通过引入vuex轻松管理各组件之间通信问题,但在一些小型的项目中,我们就没有必要去引入vuex.下 ...
- Vue兄弟组件通信
Vue兄弟组件通信之借助中央事件总线 下载链接:https://www.yinxiangit.com 其实要实现兄弟组件通信,就算是通过父子组件通信的方式也是可以达到的,如 子 ——>父——&g ...
- Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)
Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...
- vue 父子组件通信
算是初学vue,整理一下父子组件通信笔记. 父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息. 一.父组件向子组件下发数据: 1.在子组件中显式地用props选项声明它预期的数据 ...
- vue学习指南:第七篇(详细) - Vue的 组件通信
Vue 的 父传子 子传父 一.父组件向子组件传值: 父传子 把需要的数据 传递给 子组件,以数据绑定(v-bind)的形式,传递到子组件内部,供子组件使用 缩写是(:) 1.创建子组件,在src/ ...
- 如何理解vue.js组件的作用域是独立的
vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...
- VUE简单组件通信
[x] 1.prop组件通信 1.简单理解 2.多层嵌套 [x] 2.使用ref进行组件通信 [x] 3.$emit组件通信 1.prop组件通信 1.简单理解 有点类似于应式的感觉,我不管你要不要只 ...
- vue 父子组件通信props/emit
props 1.父组件传递数据给子组件 父组件: <parent> <child :childMsg="msg"></child>//这里必须要 ...
- vue中组件通信
组件的通信 1. 父子组件通信 案例: //父子组件通信思路 // 1 将父组件的数据传给子组件 在子组件上自定义单项数据绑定 // 2 子组件用props 接受自定义的那个:号属性 Vue.co ...
- vue父子组件通信高级用法
vue项目的一大亮点就是组件化.使用组件可以极大地提高项目中代码的复用率,减少代码量.但是使用组件最大的难点就是父子组件之间的通信. 子通信父 父组件 <template> <div ...
随机推荐
- Django中的ORM转换为SQL语句日志
如果想打印ORM转换过程中的SQL,需要在settings中进行如下配置: LOGGING = { 'version': 1, 'disable_existing_loggers': False, ' ...
- 微信小程序学习随笔
scroll-view与view 要做出滚动视图的效果 <scroll-view> <view id="1">11</view> <vie ...
- 主成分分析(PCA)介绍
目录 计算过程 投影分量计算 假设你有一家理发店,已经记录了过去一年中所有顾客的头发长度和发型偏好的数据.现在你想从这些数据中提取一些主要的信息,比如顾客最常选择的发型类型,以及不同发型之间的相关性等 ...
- .NET8 Hello World!
使用ASP.NET Core Web Application模板创建的Empty项目如下: 这是一个最简单的Web项目,运行起来会在根路径响应Hello World! 2.1.1 Progra ...
- C#.NET 国密 SM2 公钥证书从文本转换
先前的 Util 是直接从文件中转换的 https://www.cnblogs.com/runliuv/p/15079404.html public static AsymmetricKeyParam ...
- 牛客网在线编程-语法篇-基础语法——C 语言解题集
前言 牛客网在线编程-语法篇-基础语法--C 语言解题集. 点击下方超链接跳转至对应编程题目,文章包含解析及源码. 01-基础语法 简单输出 BC1-Hello Nowcoder BC2-小飞机 基本 ...
- 在线HMAC加密工具
在线HMAC加密工具提供一站式服务,支持MD5至SHA512.RIPEMD160及SM3等多种哈希算法,用户可便捷选择算法并生成安全的HMAC散列值,确保消息完整性与验证来源.适用于开发调试.网络安全 ...
- gson转换对象对字段别名处理@SerializedName注解demo
/** * */ package json; import java.util.Date; import java.util.Objects; import com.autoyol.platformf ...
- python UI自动化,怎么在控制台调试代码?
Chrom 控制台调试脚本 http://testingpai.com/article/1606720137383 可以在任意网页按 F12 进入开发者工具,选择 console 输入 JS 代码: ...
- rar终端常用命令
rar终端常用命令 1. 跳过目录: rar a xxx.rar -x./path_to_dir/ ./xxx/ [注] rar后面的文件夹不需要通配符 2. 加密码 rar a xxx.tar -p ...