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

IT科技类资讯2025-11-05 13:59:2269299

写在前面

我们会讲以下七种组件通信方式:

props emit v-model refs provide/inject eventBus vuex/pinia

举个例子

本文将使用如下演示,中的组件如下图所示:

上图中,通信列表和输入框分别是中的组件父组件和子组件。根据不同的通信通信方式,会调整父子组件。中的组件

1、通信Props

props 是中的组件 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 =

}

子组件只需要渲染父组件传递的值。

代码如下:

  • {{ i}}
  • 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 =

    }

    点击子组件中的【添加】按钮后,我们会发出一个自定义事件,并将添加的值作为参数传递给父组件。

    父组件代码如下:

  • {{ i}}
  • 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-model  

    v-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中的一个属性名。

    在父组件中使用比较简单,代码如下:

  • {{ i}}
  • import { ref } from vue

    import ChildComponents from ./child.vue

    const list = ref([JavaScript, HTML, CSS])

    4、b2b供应网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/inject

    provide/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 =

    }

    子组件

  • {{ i}}
  • import { inject } from vue

    // Accept data provided by parent component

    const list = inject(list)

    注意:使用 provide 进行数据传输时,尽量使用 readonly 封装数据,避免子组件修改父组件传递的数据。

    6、eventBus

    Vue 3 中移除了 eventBus,但可以借助第三方工具来完成。Vue 官方推荐使用 mitt 或 tiny-emitter。

    在大多数情况下,不建议使用全局事件总线来实现组件通信。免费源码下载虽然比较简单粗暴,但是维护事件总线从长远来看是个大问题,这里就不解释了。有关详细信息,您可以阅读特定工具的文档。

    7、vuex/pinia

    Vuex 和 Pinia 是 Vue 3 中的状态管理工具,使用这两个工具可以轻松实现组件通信。由于这两个工具都比较强大,这里就不一一展示了。有关详细信息,请参阅文档。

    本文地址:http://www.bzve.cn/html/323c62599051.html
    版权声明

    本文仅代表作者观点,不代表本站立场。
    本文系作者授权发表,未经许可,不得转载。

    热门文章

    全站热门

    密码错误后自锁多久?解析密码错误自动锁定功能的作用与设置(密码错误自动锁定的时间设置和安全保护)

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    线上问题排查,这些命令你一定用得到!

    浅谈:前端如何赋能业务

    三星S7防水效果如何?(探究三星S7防水功能的可靠性和实用性)

    我用Python帮朋友做了张猪肉数据分析图,结果。。。

    CXO和不懂组织管理的主将都是滥竽充数-唐太宗与魏征漫谈组织

    一款不用写代码,简单,高效的开源自动化测试工具

    友情链接

    滇ICP备2023006006号-39