一、组合式API下的父子组件通信

1、父传子


	1、基本思想
	    1.1、父组件中给子组件绑定属性
	    1.2、子组件内部通过props接收
	2、用法
	    2.1、父组件
	        <conComVue message="this is app">
	    2.2、子组件
	        //由于写了setup,因此无法直接使用props选项
	        //所以需要通过defineProps“编译器宏”接收子组件传递的数据
	        const props = defineProps({
	            message:String        
	        })
	        ...
	        {{ message }}
	        
	3、defineProps原理
	      //编译阶段的一个标识,编译器解析时,遇到后进行编译转换
	      

2、子传父


	1、基本思想
	    1.1、父组件中给子组件通过@绑定事件
	    1.2、子组件内部通过emit方法触发事件
	2、用法
	    2.1、父组件
	        //@子组件传递的标识符="触发的函数"
	        <sonComVue @get='getMessage'>
	    2.2、子组件
	        const emit = defineEmits(['get-message'])
	        const sendMsg = () => {
	            //传递给父组件的标识符,传递的参数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
	            emit('get', 'this is son')        
	        }
	        

3、跨父子通信


	1、概念
	    顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信
	    
	2、用法
	    2.1、顶层组件通过provide函数提供数据
	        provide('key',顶层组件中的数据)
	        
	    2.2、底层组件通过inject获取数据
	        const message = inject('key')
	3、注
	    若想要在底层组件修改顶层组件数据,应该借由顶层组件提供的方法实现
    

二、模板引用

1、模板引用的概念


	1、概念
	    通过ref标识获取真实的dom对象或者组件实例对象
	    
	2、用法
	    2.1、调用ref函数生成一个ref对象
	        const h1Ref = ref(null)
	    2.2、通过ref标识绑定ref对象到标签
	        <h1 ref="h1Ref">DOM标签</h1>
	    //绑定后,h1Ref中就有了h1的组件信息,通过h1Ref.value便可以访问到绑定的元素
	    
	3、注
	    3.1、若要访问绑定的元素,必须要在绑定的元素加载完成之后
	    3.2、父元素不可以直接获取子元素中的信息,因为在<script setup>语法糖下,组件内部的属性和方法是不开放的,通过defineExpose编译宏指定哪些属性和方法允许访问
	        const conut = 999
	        const sayHi = () =>{
	            console.log('Hi')        
	        }
	        defineExpose({
	            count,
	            sayHi        
	        })
	        

二、vue3.3新特性

1、defineOptions


	1、概念
	    在使用了<script setup>后,无法再方便的使用props、emits、name等属性,于是便引入了defineProps和defineEmits,可也只能解决这两个属性,
	    若要解决其他属性的问题,应该使用defineOptions
	2、示范
	    defineOptions({
	        name:'GuGe'
	    })
	    

2、defineModel


	1、概念
	    在vue3中,若想接受v-model的数据,会很麻烦,于是引入了defineModel
	2、用法
	    2.1、父组件
	        let isVisible = 123
	        ...
	        <child v-model="isVisible">
	        
	    2.2、子组件
	        import { defineModel } from 'vue'
	        const modelValue = defineModel()
	        ...
	        modelValue.value = 100
	        //可以直接修改
	        
	3、注
	    3.1、若想使用defineModel,需要在vite.comfig.js中进行修改
	        plugins:[
	            vue({
	                script:{
	                    defineModel:true                
	                }            
	            })        
	        ]
	        
03-19 04:34