七个 Vue 3 中的组件通信方式

写在前面
我们会讲以下七种组件通信方式:
props emit v-model refs provide/inject eventBus vuex/pinia举个例子
本文将使用如下演示,中的组件如下图所示:

上图中,通信列表和输入框分别是中的组件父组件和子组件。根据不同的通信通信方式,会调整父子组件。中的组件
1、通信Propsprops 是中的组件 Vue 中最常见的父子通信方式,使用起来也比较简单。通信
根据上面的中的组件demo,我们在父组件中定义了数据和对数据的通信操作,子组件只渲染一个列表。中的组件
父组件代码如下:
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
add
import { ref } from vue
import ChildComponents from ./child.vue
const list = ref([JavaScript,通信 HTML, CSS])
const value = ref()
// event handling function triggered by add
const handleAdd = () => {
list.value.push(value.value)
value.value =
}
子组件只需要渲染父组件传递的值。
代码如下:
import { defineProps } from vue
const props = defineProps({
list: {
type: Array,中的组件
default: () => [],
},
})
2、Emit<template>Emit也是通信Vue中最常见的组件通信方式,用于子组件向父组件传递消息。中的组件
我们在父组件中定义列表,子组件只需要传递添加的源码下载值。
子组件代码如下:
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
add
import { ref, defineEmits } from vue
const value = ref()
const emits = defineEmits([add])
const handleSubmit = () => {
emits(add, value.value)
value.value =
}
点击子组件中的【添加】按钮后,我们会发出一个自定义事件,并将添加的值作为参数传递给父组件。
父组件代码如下:
import { ref } from vue
import ChildComponents from ./child.vue
const list = ref([JavaScript, HTML, CSS])
// event handling function triggered by add
const handleAdd = value => {
list.value.push(value)
}
在父组件中,只需要监听子组件的自定义事件,然后执行相应的添加逻辑即可。
3、v-modelv-model 是 Vue 中一个优秀的语法糖,比如下面的代码。
这是以下代码的简写形式
这确实容易了很多。现在我们将使用 v-model 来实现上面的示例。
子组件
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
add
import { ref, defineEmits, defineProps } from vue
const value = ref()
const props = defineProps({
list: {
type: Array,
default: () => [],
},
})
const emits = defineEmits([update:list])
// Add action
const handleAdd = () => {
const arr = props.list
arr.push(value.value)
emits(update:list, arr)
value.value =
}
在子组件中,我们先定义props和emits,添加完成后再发出指定的事件。
注意:update:*是Vue中固定的写法,*代表props中的一个属性名。
在父组件中使用比较简单,代码如下:
import { ref } from vue
import ChildComponents from ./child.vue
const list = ref([JavaScript, HTML, CSS])
4、IT技术网Refs使用API选项时,我们可以通过this.$refs.name获取指定的元素或组件,但在组合API中不行。如果我们想通过ref获取,需要定义一个同名的Ref对象,在组件挂载后可以访问。
示例代码如下:
{{ i}}
import { ref } from vue
import ChildComponents from ./child.vue
const childRefs = ref(null)
子组件代码如下:
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
add
import { ref, defineExpose } from vue
const list = ref([JavaScript, HTML, CSS])
const value = ref()
// event handling function triggered by add
const handleAdd = () => {
list.value.push(value.value)
value.value =
}
defineExpose({ list })
注意:默认情况下,setup 组件是关闭的,通过模板 ref 获取组件的公共实例。如果需要公开,需要通过defineExpose API 公开。
5、provide/injectprovide/inject是 Vue 中提供的一对 API。无论层级多深,API 都可以实现父组件到子组件的数据传递。
示例代码如下所示:
父组件
v-model="value"
type="text"
class="form-control"
placeholder="Please enter"
/>
add
import { ref, provide } from vue
import ChildComponents from ./child.vue
const list = ref([JavaScript, HTML, CSS])
const value = ref()
// Provide data to child components.
provide(list, list.value)
// event handling function triggered by add
const handleAdd = () => {
list.value.push(value.value)
value.value =
}
子组件
import { inject } from vue
// Accept data provided by parent component
const list = inject(list)
注意:使用 provide 进行数据传输时,尽量使用 readonly 封装数据,避免子组件修改父组件传递的数据。
6、eventBusVue 3 中移除了 eventBus,但可以借助第三方工具来完成。Vue 官方推荐使用 mitt 或 tiny-emitter。
在大多数情况下,不建议使用全局事件总线来实现组件通信。云服务器提供商虽然比较简单粗暴,但是维护事件总线从长远来看是个大问题,这里就不解释了。有关详细信息,您可以阅读特定工具的文档。
7、vuex/piniaVuex 和 Pinia 是 Vue 3 中的状态管理工具,使用这两个工具可以轻松实现组件通信。由于这两个工具都比较强大,这里就不一一展示了。有关详细信息,请参阅文档。
相关文章
- 摘要:随着电脑的普及,学会如何安装操作系统成为了必备的技能之一。本文将为大家详细介绍如何使用电脑安装系统的步骤和注意事项,让大家能够轻松掌握这一技能。了解电脑硬件要求...2025-11-05
浏览器的开发者工具为我们提供了强大的调试系统,可以用来查看DOM树结构、CSS样式调试、动画调试、JavaScript代码断点调试等。今天我们就来看看console调试的那些实用的调试技巧。如今,我们2025-11-05
介绍一个和深色模式相关的CSS属性:color-scheme。一、什么是 color-scheme?color-scheme[1]顾名思义,即为“配色方案”,在系统中指的是“白天模式”和“夜间模式”。2025-11-05
背景最近生产爆出一条慢sql,原因是用了or和!=,导致索引失效。于是,总结了索引失效的十大杂症,希望对大家有帮助,加油。一、查询条件包含or,可能导致索引失效新建一个user表,它有一个普通索引us2025-11-05主板接线安装教程(详细步骤指南让你轻松安装主板,打造个性化电脑体验)
摘要:在当今数字化时代,电脑已经成为人们生活中不可或缺的一部分。如果你是一位电脑爱好者或者计算机专业学生,那么你可能对如何正确安装主板有一些疑问。本文将为您提供一份详细的主板接线安装教程...2025-11-05
1、格式化默认的字符串化器还会缩小 JSON,看起来很难看const user = {name: John,age: 30,isAdmin: true,friends: [Bob, Jane],add2025-11-05

最新评论