Vue3组件通信

86 阅读1分钟

props defineProps(obj)

父组件在使用子组件时绑定属性,子组件通过defineProps函数来接收数据 defineProps函数接收一个对象类型的参数,对象内的属性可以是值类型,也可以是对象。

示例1

下方子组件代码中:msg为对象,num为值类型

父组件

<template>
  <div>
    <LocalComponent num=123 msg="hello world"/> 
  </div>
</template>
<script setup lang="ts">
import LocalComponent from "../components/component/LocalComponent.vue"
</script>

子组件

<template>
    <div>
       {{ msg }}*****{{ num }}
    </div>
</template>
<script lang="ts" setup>
const props = defineProps({
    msg:{
        type:String,
        default:'',
    },
    num:Number
});
</script>

示例2 defineProps结合泛型使用

父组件

<template>
  <div>
    <LocalComponent :user="user" /> 
  </div>
</template>
<script setup lang="ts">
import { reactive } from "vue"
import LocalComponent from "../components/component/LocalComponent.vue"

const user = reactive({
  name:'jack',
  age:111,
});

</script>

子组件

<template>
    <div>
       {{ user.age }}**{{ user.name }}
    </div>
</template>
<script lang="ts" setup>
interface IUser{
    name:string;
    age:number;
}
const props = defineProps<{user:IUser}>();//defineProps是一个函数,可以使用泛型
</script>

emits defineEmits(arr)

defineEmits接收一个数组,数组内是子组件注册的一系列事件,父组件可以监听这些事件。

示例1

子组件注册change事件

<template>
    <div>
       <button @click="onChange">子组件的按钮</button>
    </div>
</template>
<script lang="ts" setup>
const emit = defineEmits(['change']);
const onChange = () => {
    emit('change',100);
}
</script>

父组件监听change事件

<template>
  <div>
    {{ num }}
    <LocalComponent @change="handleChange"/> 
  </div>
</template>
<script setup lang="ts">
import { ref } from "vue"
import LocalComponent from "../components/component/LocalComponent.vue"

const num = ref(0);
const handleChange = (n) => {
  num.value = n;
}
</script>

示例2 defineEmits与泛型结合

子组件

<template>
    <div>
       <button @click="onChange">按钮</button>
    </div>
</template>
<script lang="ts" setup>
interface IEvents {
    (e:'change',num:number):void;
}
const emit = defineEmits<IEvents>();
const onChange = () => {
    emit('change',123);
}
</script>

父组件

<template>
  <div>
    <LocalComponent @change="handleChange" /> 
  </div>
</template>
<script setup lang="ts">
import LocalComponent from "../components/component/LocalComponent.vue"

const handleChange = (n:number) => {
  alert(n);
}
</script>