Vue学习:16-组件之数据传递(子传父)

有的时候,父组件在使用子组件时,子组件如何给父组件传值呢?分为以下三步进行:

  1. 子组件声明自定义的事件

  2. 子组件中触发自定义事件(可传值)

  3. 父组件使用子组件时监听对应的自定义事件,并执行父组件中的函数(获取子组件传递的值)

一、【子组件】声明组件事件

  1. 在选项式 API 中,子组件可通过emits选项来声明自定义的事件

  2. 在组合式 API 中,子组件可通过defineEmits()宏来声明自定义的事件

(一)字符串数组式声明自定义事件

采用字符串数组可以声明简单的自定义事件

<script setup>

    defineEmits(['inFocus', 'submit'])

</script>

(二)对象式声明自定义事件

采用对象式声明自定义事件,还可以进行校验传递的参数是否符合预期要求

对象式声明自定义事件中,属性名为自定义事件名,属性值则是是否验证传递的参数:

1、属性值为null,则不需要验证

2、属性值为函数时,参数为传递的数据,函数返回true则验证通过,返回false则验证失败,验证失败可以用警告语句提示开发者【注意:无论是true还是false都会继续执行下去的,父组件都会获取到传递的值】

<script setup>
    
defineEmits({
    autoEvent1: null, // 无需校验
    // 需要校验,param 可以是多个参数,返回布尔值来表明事件是否合法
    autoEvent2: (param) => {
        // true 则通过
        // false 则不通过,可以在控制台输入警告语句
    }
})
    
</script>

二、【子组件】触发组件事件

在选项式 API 中,可通过组件当前实例this.$emit(event, ...args)来触发当前组件自定义的事件

在组合式 API 中,可调用defineEmits宏返回的emit(event, ...args)函数来触发当前组件自定义的事件

其中上方两个参数分别为:

● event:触发事件名,字符串类型

● ...args:传递参数,可没有,可多个

Button.vue

<script setup>

// 自定义事件,并返回 emit 函数
const emit = defineEmits(['changeAge'])

function emitAgeEvent() {
    // 触发自定义事件 changeAge,并传递参数 1,20
    emit('changeAge', 1, 20)
}
</script>

<template>
    <button @click="emitAgeEvent">触发自定义事件</button>
    <hr>
    <!-- 触发自定义事件 changeAge,并传递参数 30 -->
    <button @click="emit('changeAge', 30)">触发自定义事件</button>
</template>

三、【父组件】监听子组件自定义事件

使用v-on:event="callback"或者@event="callback"来监听子组件是否触发了该事件

1、event:事件名字(camelCase 形式命名的事件,在父组件中可以使用kebab-case形式来监听)

2、callback:回调函数,如果子组件触发该事件,那么在父组件中执行对应的回调函数,回调函数声明参数可自动接收到触发事件传来的值

App.vue

<script setup>
import { ref } from 'vue';

import ButtonVue from './components/Button.vue';

let startAge = ref(0)
let endAge = ref(0)

// 子组件触发事件的回调函数
function addAge(start_age, end_age) {
    console.log('----------------');
    console.log(start_age)
    console.log(end_age)
    startAge.value = start_age
    endAge.value = end_age
}
</script>

<template>
    <h3>
        开始年龄:{{ startAge }}
    </h3>
    <h3>
        结束年龄:{{ endAge }}
    </h3>
    
    <!-- 使用引入的组件,并通过属性传递数据 -->
    <ButtonVue @change-age="addAge" />
</template>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值