深入理解 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 ...
随机推荐
- salesforce零基础学习(一百三十八)零碎知识点小总结(十)
本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_apex_5level_SOQLqueries.htm& ...
- Windows Server 2022 安装
获取 Windows Server 2022 https://www.microsoft.com/zh-cn/evalcenter/evaluate-windows-server-2022 查看 Wi ...
- Linux下的物理CPU和逻辑CPU
1.物理CPU (1)物理CPU是指:机器中插槽上的实际CPU个数. (2)物理CPU的数量:可以通过不重复的physical id来查询. (3)命令: cat /proc/cpuinfo | gr ...
- WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)
在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None".AllowsTransparency="True" 这两个 ...
- css之伪元素选择器
注:本博客内容来自尚硅谷禹神的前端入门课程 什么是伪元素? 很像元素,但不是元素(element),是元素中的一些特殊位置. 伪元素语法中的::可以用:,因为css2中没有明确区分伪类和伪元素,但是s ...
- 题解 P2497 [SDOI2012]基站建设
解题思路 CDQ优化DP 下文中 \(pos_i\) 表示编号为 \(i\) 的位置或者说坐标. 暴力 DP 转移方程是 \(f_i=\min\limits_{1\le j<i}\{f_j+\d ...
- 代码审计——基础(JAVASE)
JAVASE 目录 JAVASE 基本语法 关键字 变量 作业1 作业完成 第一题:简单的介绍了java语言历史,优势.发展 第二题:特性:面向对象.跨平台.封装.继承.多态.抽象.扩展性.健壮性.垃 ...
- undefined和null js数据类型转换自动转换布尔类型
基本数据类型之undefined和null undefined是表示未找到,是变量没有正确赋值数据时,生成的数据类型 var int : console.log(int)//undefined nul ...
- 自定义动画 jquery的结束动画
<button name="width">改变宽</button> <button name="height"> ...
- kvm链接克隆虚拟机迁移到openstack机器的实验
总结 如果是完整克隆的那种虚拟机,是可以直接在openstack使用的,如果镜像格式没问题的话. 因为kvm虚拟机大部分都是链接克隆出来的镜像,不可用直接复制使用,所以需要创建新的镜像文件 创建空盘: ...