vue3 父子组件通信

1.props

父组件传参不变,子组件接收:

通过defineProps 来接受, 无需额外引入,直接使用

<template>
<div class="menu">
  菜单区域 {{ title }}
  <div>{{ data }}</div>
</div>
</template>

<script setup lang="ts">
defineProps<{
  title:string,
  data:number[]
}>()
</script>

 withDefaults是个函数也是无须引入开箱即用接受一个props函数第二个参数是一个对象设置默认值

type Props = {
    title?: string,
    data?: number[]
}
withDefaults(defineProps<Props>(), {
    title: "张三",
    data: () => [1, 2, 3]
})

 

2.emit

父组件接收不变,子组件传参如下:

在子组件绑定了一个click 事件 然后通过defineEmits 注册了一个自定义事件

点击click 触发 emit 去调用我们注册的事件 然后传递参数

const emit = defineEmits(['increment'])
const count = ref(100)
const increment = () => {
  count.value++
  emit('increment', count.value)
}

 

defineExpose

明确哪些数据或方法应该被暴露给父组件 

<template>
  <Child ref="childComponentRef" />
  <button @click="getChildData">获取子组件数据</button>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import Child from './Child.vue';

// 定义一个 ref 来存储子组件的实例
const childComponentRef = ref<InstanceType<typeof Child> | null>(null);

function getChildData() {
  if (childComponentRef.value) {
    console.log(childComponentRef.value.list);
  }
}
</script>

 

const list = reactive<number[]>([4, 5, 6])
 
defineExpose({
    list
})

 

posted on 2022-10-13 19:20  sss大辉  阅读(585)  评论(0编辑  收藏  举报

导航