008Vue3语法糖defineProps、defineEmits、defineExpose

008Vue3语法糖defineProps、defineEmits、defineExpose

获取组件传值defineProps

// 采用ts专有声明,无默认值
defineProps<{
  msg: string;
  num?: number;
}>();

// 采用ts专有声明,有默认值
interface Props {
  msg?: string;
  labels?: string[];
}
const props = withDefaults(defineProps<Props>(), {
  msg: 'hello',
  labels: () => ['one', 'two'],
});

// 非ts专有声明
defineProps({
  msg: String,
  num: {
    type: Number,
    default: '',
  },
});

子组件向父组件事件传递defineEmits

// ts专有
const emit = defineEmits<{ (e: 'click', num: number): void }>();
// 非ts专有
const emit = defineEmits(['click']);

// 通过事件发送
const clickThis = () => {
  emit('click', 2);
};

组件暴露自己的属性defineExpose

  • 子组件
<template>
  <div>子组件{{ count }}</div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
const count = ref(123456);
const add = (a: number, b: number): number => {
  return a + b;
};
defineExpose({
  add,
  count,
});
</script>

  • 父组件
<template>
  <div @click="helloClick">父组件</div>
  <div @click="add(8, 9)">add</div>
  <TestChild ref="hello"></TestChild>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import TestChild from './TestChild.vue';
const hello = ref<any>(null);

const helloClick = () => {
  console.log(hello?.value?.count);
};
const add = (a: number, b: number): number => {
  console.log(666.333, hello, hello?.value?.add(5, 6));
  return hello?.value?.add(a, b);
};
</script>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿赛工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值