vue3组件之间传输数据

在Vue3中,组件间数据传输主要有以下几种方式:

1. Props(父传子)

父组件通过属性绑定向子组件传递数据:

vue 复制代码
<!-- 父组件 -->
<Child :title="pageTitle" :count="counter" />

<!-- 子组件 -->
<script setup>
const props = defineProps({
  title: String,
  count: Number
})
console.log(props.title) // 使用数据
</script>

2. Emit(子传父)

子组件通过事件向父组件传递数据:

vue 复制代码
<!-- 子组件 -->
<button @click="$emit('update', newValue)">提交</button>

<!-- 父组件 -->
<Child @update="handleUpdate" />

<script setup>
function handleUpdate(value) {
  console.log('收到子组件数据:', value)
}
</script>

3. ref获取组件实例

父组件直接访问子组件数据:

vue 复制代码
<!-- 父组件 -->
<Child ref="childRef" />
<button @click="getChildData">获取</button>

<script setup>
import { ref } from 'vue'
const childRef = ref(null)

function getChildData() {
  console.log(childRef.value.childData)
}
</script>

4. Provide/Inject(跨级传递)

祖先组件提供数据:

javascript 复制代码
// 祖先组件
import { provide } from 'vue'
provide('theme', 'dark')

后代组件注入数据:

javascript 复制代码
// 后代组件
import { inject } from 'vue'
const theme = inject('theme')

5. 状态管理(Pinia)

复杂场景使用状态管理库:

javascript 复制代码
// store/counter.js
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  actions: {
    increment() {
      this.count++
    }
  }
})
vue 复制代码
<!-- 组件中使用 -->
<script setup>
import { useCounterStore } from '@/stores/counter'
const counter = useCounterStore()
</script>

<template>
  <button @click="counter.increment()">{{ counter.count }}</button>
</template>

6. 事件总线(Event Bus)

使用第三方库实现全局事件:

javascript 复制代码
// eventBus.js
import mitt from 'mitt'
export const emitter = mitt()
javascript 复制代码
// 组件A
emitter.emit('message', 'Hello')

// 组件B
emitter.on('message', (msg) => {
  console.log(msg) // 输出: Hello
})

根据场景选择合适的数据传递方式:

  • 简单父子通信:Props/Emit
  • 跨层级传递:Provide/Inject
  • 复杂应用状态:Pinia
  • 全局事件:事件总线

注意:Vue3推荐使用Composition API的setup语法糖,所有示例均采用该写法。

相关推荐
Lee川4 小时前
Milvus 实战:当 RAG 遇上向量数据库,从"玩具 Demo"到"生产可用的"那一步
前端·数据库·人工智能
anOnion4 小时前
构建无障碍组件之Toolbar Pattern
前端·html·交互设计
惊鸿一博5 小时前
图标加载方式_zeroIcon_是否加前缀mdi
开发语言·前端·javascript
2501_940041745 小时前
前端工程化进阶:5个高交互与可视化项目提示词
前端
你很易烊千玺5 小时前
JS 异步 从零讲(大白话 + 真实场景 + 可运行案例)
前端·javascript·vue.js
华洛7 小时前
讲讲如何在传统产品中挖掘AI需求
javascript·产品经理·产品
why技术7 小时前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
大家的林语冰8 小时前
CSS 已死?DOM 性能黑洞!Pretext 排版革命让你在文本间跳舞,没有 DOM 也能纵享丝滑~
前端·javascript·css
vipbic8 小时前
我也该升级了,陪伴了我7年的博客
前端
Lee川8 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端