父组件 :对子组件属性绑定要通讯的数据。
子组件:通过defineProps来进行数据接收。
子组件:通过emit创建向父组件传递数据事件
父组件:通过自定义事件接收子组件传递数据。
准备工作:安装mitt依赖包(npm i mitt),创建emitter.ts文件。
组件A(发送数据):通过emitter.emit绑定事件。
组件B(接收数据):通过emitter.on接收事件,取出数据。并在组件销毁时通过 emitter.off解绑事件。
v-model实现原理实际是通过属性绑定(父传子)和事件绑定(子传父)
html原始元素(input等)和 vue2中 v-model底层 属性名为:value 事件名为 @input
vue3中 v-mode 底层属性名为:modelValue 事件名为@update:modelValue ,update:modelValue中的属性名没有任何意义就是字符串
封装组件
当父组件向子组件传递数据,在子组件中并未声明使用则数据会暂存到组件$attrs中,此时子组件可以通过v-bind="$attrs",将这些暂存数据传递给孙组件中。
父组件
子组件
孙组件
组件通过defineExpose对外暴露要传递的数据,
父组件
- <div>
- 04$refs
- {{ msg }}
- <p>{{ x }}p>
- <button @click="chang1">查看子组件1数据button>
- <button @click="chang2" style="margin-left: 10px;">查看子组件2数据button>
- <button @click="chang3($refs)" style="margin-left: 10px;">获取所有子组件数据button>
- <son1 ref="son1Ref">son1>
- <son2 ref="son2Ref">son2>
-
- div>
-
- <script setup>
- import son1 from './06$refs-$parents/son1.vue'
- import son2 from './06$refs-$parents/son2.vue'
- import {ref} from 'vue'
- let msg = ref('3')
- let x = 10
- let son1Ref = ref()
- let son2Ref = ref()
- function chang1(){
- //子组件需要暴露出具才能获取到
- console.log("我是父组件获取子组件数据和事件");
- console.log(son1Ref.value)
- console.log(son1Ref.value.a);
- console.log(son1Ref.value.b);
- son1Ref.value.changeData()
- }
- function chang2(){
- //子组件需要暴露出具才能获取到
- console.log(son2Ref.value)
- }
- function chang3(e){
- //获取所有子组件实例对象
- console.log(e);
- }
- defineExpose({msg,x})
-
- script>
子组件
父组件通过provide传递数据,后代组件通过inject接收数据
父组件
子组件
插槽分为:默认插槽,具名插槽,作用域插槽(父组件插槽内容使用子组件数据)
默认插槽
父组件
- <son>
- <h3>默认插槽h3>
- son>
子组件
- <p>下面是默认插槽内容p>
- <slot>slot>
具名插槽
父组件
- <son>
- <template v-slot:s2>
- <h3>具名插槽h3>
- template>
- son>
子组件
- <p>下面是具名插槽内容p>
- <slot name="s2">slot>
作用域插槽
父组件
-
- <template v-slot="cars">
- <h2>我是作用域插槽h2>
- <div v-for="item in cars.carList" :key="item.name">{{ item.name }}
- div>
- template>
-
子组件
- <slot :carList="carList">slot>