defineProps、defineEmits、defineExpose 
- defineProps用来父子组件之间数据传递
 - defineEmits用来定义组件事件
 - defineExpose暴露给父组件的方法或属性
 
1、defineProps 
<!-- Parent.vue -->
<template>
  <div>
    <Counter :initialCount="count" />
  </div>
</template>
<script  setup>
import { ref } from 'vue';
import Counter from './Counter.vue';
const count = ref(100);
</script>
<!-- Counter.vue -->
<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>
<script setup>
import { ref } from 'vue';
// 定义属性
const props = defineProps({
  initialCount: {
    type: Number,
    required: true
  }
});
// 使用属性
const count = ref(props.initialCount);
function increment() {
  count.value++;
}
</script>2、defineEmits 
<!-- Parent.vue -->
<template>
  <div>
    <Counter :initialCount="count" @update:count="handleCountUpdate" />
  </div>
</template>
<script setup>
import { ref } from 'vue';
import Counter './Counter.vue'
const count = ref(100)
function handleCountUpdate(value) {
  console.log(value)
}
</script>
<!-- Counter.vue -->
<template>
  <div>
    <p>{{ count }}</p>
    <button @click="handleIncrement">Increment</button>
  </div>
</template>
<script setup>
import { ref } from 'vue';
// 定义属性
const props = defineProps({
  initialCount: {
    type: Number,
    required: true
  }
});
// 定义事件
const emit = defineEmits(['update:count']);
const count = ref(props.initialCount);
function handleIncrement() {
  count.value++;
  emit('update:count', count.value);
}
</script>3、defineExpose 
<!-- Parent -->
<template>
  <Counter ref="counter" :initialCount="10" @update:count="handleCountUpdate" />
  <button @click="resetCounter">Reset Counter</button>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import Counter from './Counter.vue';
const counter = ref(null);
function handleCountUpdate(value) {
  console.log(value);
}
function resetCounter() {
  counter.value.reset();
}
</script>
<!-- Counter.vue -->
<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>
<script setup>
import { ref } from 'vue';
// 定义属性
const props = defineProps({
  initialCount: {
    type: Number,
    required: true
  }
});
// 定义事件
const emit = defineEmits(['update:count']);
const count = ref(props.initialCount);
function increment() {
  count.value++;
  emit('update:count', count.value);
}
function resetCount() {
  count.value = props.initialCount;
}
// 暴露方法
defineExpose({
  reset: resetCount
});
</script>