vue3中的组件通信

本文详细介绍了Vue3中父子组件间的通信方式,包括使用`props`和`emit`进行数据传递,以及在深度组件通信中如何利用`provide`和`inject`进行跨级数据传递。示例代码展示了如何在不同组件间有效地管理数据流动,以实现更灵活的组件交互。同时,文章还提到了在使用`provide`和`inject`时需要注意的响应式数据传递问题。
摘要由CSDN通过智能技术生成

本篇的组件通信不涉及vuex

1、父子组件通信props&emit

vue3中的definePropsdefineEmits不用引入,可以直接使用

父组件

<template>
	<Son tip="fatherData" @clickFather = handleClick></Son>
</template>
<script setup>
	// 导入子组件
	import Son from './son.vue'
	// 接收子组件事件传递来的数据
	const handleClick = (data) => {
	  console.log(data);
	}
<script>

子组件

<template>
    <el-tag type="success">{{tip}}</el-tag>
    <el-button type='primary' @click="clickSon">子组件</el-button>
</template>
<script setup>
	// 接收父组件传来的数据
	defineProps({
	  tip:String
	})
	const emit = defineEmits(['clickFather'])
	const clickSon = () => {
	  emit('clickFather', '子组件传过来的数据')
	}
<script>

2、跨级通信provide&inject

当组件的深度比较大的时候,用父子之间的通信需要层层传递,不优雅。

演示需要依旧使用父子组件,三级组件可以自己试试

// 父组件
<template>
	<Son tip="fatherData" @clickFather = handleClick></Son>
</template>
<script setup>
	// 导入reactive,provide
	import { reactive, provide } from 'vue'
	// 导入子组件
	import Son from './son.vue'
	// 接收子组件事件传递来的数据
	const handleClick = (data) => {
	  console.log(data);
	}
	// 传递静态数据
	provide('geolocation', {
	  longitude: 90,
	  latitude: 135
	})
	// 传递响应式数据,注意这里的provide一定要写在响应式数据的后面
	const state = reactive({ count: 0 })
	provide( 'count',state)
	
	// 这样会报错
	// provide( 'count',state)
	// const state = reactive({ count: 0 })

<script>

子组件

<template>
    <el-tag type="success">{{tip}}</el-tag>
    <el-tag type="success" @click="handle">{{inject2.count}}</el-tag>
    <el-button type='primary' @click="clickSon">子组件</el-button>
</template>
<script setup>
	import { inject } from 'vue'
	// 接收父组件传来的数据
	defineProps({
	  tip:String
	})
	const inject1 = inject('geolocation')
	console.log(inject1);
	const inject2 = inject('count')
	const handle = () => {
	  inject2.count++
	}
<script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值