vue3组件通信

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。相比于普通的 <script> 语法,它具有更多优势:

  • 更少的样板内容,更简洁的代码。
  • 能够使用纯 TypeScript 声明 props 和自定义事件。
  • 更好的运行时性能 (其模板会被编译成同一作用域内的渲染函数,避免了渲染上下文代理对象)。
  • 更好的 IDE 类型推导性能 (减少了语言服务器从代码中抽取类型的工作)。

文件目录结构

在这里插入图片描述

👨🏻 父组件向子组件传递数据

props方式

👨🏻 父组件


    <childA :isPropData="state.isPropData" />
    <childB />
 
	 const state = reactive({
	    isPropData:'来自父组件数据',
	 });
 

👶🏼 子组件A


	import { reactive,defineProps, onBeforeMount, onMounted } from 'vue';
	onMounted(() => {});
	//接收
	const props = defineProps({
	  isPropData: {
	    type: String,
	    default: () => '',
	  },
	})

在这里插入图片描述

provide/inject方式

👨🏻 父组件


import { provide } from 'vue';

// 向子组件传递数据
provide('fromParent', '123456')

👶🏼 子组件A


import { inject } from 'vue';

onMounted(() => {
  console.log(inject('fromParent')); //123456
});

👨🏻 父组件访问修改子组件数据、调用子组件方法

ref 方式

👨🏻 父组件

	<childA ref="isA" :isPropData="state.isPropData" />
	
	//获取到子组件
	const isA = ref(null);
	
	onMounted(() => {
	    //修改A组件数据
	    isA.value.state.data = 123
	    //访问A组件数据
	    console.log(isA.value.state.data);
	    //调用A组件方法
	    console.log(isA.value.afn());
	    
	});
	

👶🏼 子组件A

	
	import { reactive,defineProps,defineExpose, onBeforeMount, onMounted } from 'vue';
	
	const state = reactive({
	  data:'我是a组件数据'
	});
	
	//a组件方法
	const afn=()=>{
	  console.log('a组件方法执行');
	}
	
	//暴露私有数据与方法
	defineExpose({
	  state,
	  afn
	})

在这里插入图片描述

👶🏼 子组件访问修改父组件数据、方法

defineEmits 方式

👶🏼 子组件A

  	<div @click="getData"> A点击 </div>
	import { defineEmits, onBeforeMount, onMounted } from 'vue';
	
	//定义触发的方法
	const emit = defineEmits(["changeData"]);
	
	const getData = ()=>{
	  emit("changeData", '传给父组件数据');
	}
	

👨🏻 父组件


    <childA ref="isA" @changeData="doFn" :isPropData="state.isPropData" />

	const doFn = ()=>{
 	   console.log('访问、修改父组件数据');
   		 //TODO
	}
	

在这里插入图片描述

**👶🏼 子组件修改父组件数据 **

update 方式

👶🏼 子组件A

     <div @click="titleChange">
        改变title
      </div>
      
	const emit = defineEmits(["changeData",'update:title']);

	const titleChange = ()=>{
	  emit('update:title', 'title改变啦!')
	}
	

👨🏻 父组件


 <childA :title="title" @update:title="state.title = $event"  />

 const state = reactive({
    title:'组件通信'
 });

 //触发titleChange 事件 title 更改 为'title改变啦!'

🧑🏻‍🤝‍🧑🏻 兄弟组件传值

子组件B向A组件传值 & 数据操作

安装 mitt 组件通信工具
npm install mitt@3.0.0 -S
mitt 适用所有父子、兄弟等所有关系的组件通信

main.js


	let app = createApp(App)
	app.config.globalProperties.$EventBus = new mitt();

👶🏼 子组件A

	
	  import { getCurrentInstance } from 'vue';
	  const { proxy } = getCurrentInstance();
	  
	  //先解绑避免重复绑定
	  proxy.$EventBus.off('setTH');
	  
	  //监听
	  proxy.$EventBus.on('setTH', () => {
	    //TODO
	  });
	  

👶🏼 子组件B

	
	  import { getCurrentInstance } from 'vue';
	  const { proxy } = getCurrentInstance();
	  
	  //触发子组件方法
	  proxy.$EventBus.$emit('setTH', 'B组件传给A组件数据');
	  

👨‍👧‍👧 Pinia通信

文章链接💥 vue3Pinia状态管理

在这里插入图片描述

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@才华有限公司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值