组件之间通信:父传子:使用defineProps
父组件:
import Student from './Student.vue'
import { ref,onMounted } from 'vue'
const schoolName = ref('xxx')
子组件
import { ref } from 'vue'
const props = defineProps({
schoolName: {
type: String,
default: 'error'
}
})
组件之间通信:子传父:使用defineEmits
在子组件中设置回调,在子组件中设置事件声明:
子组件
// 事件声明
const emit = defineEmits(['changeSchoolName'])
const changeName = (): void => {
emit('changeSchoolName')
}
父组件
// 子传父,然后父再传给子
const changeName = (): void => {
schoolName.value = 'good'
}
子组件暴露属性给父组件:defineExpose
子组件:
// 子组件中暴露属性,可以在父组件中通过ref来访问到
const studentName = ref('tom')
defineExpose({
studentName,
obj: {
name: 'paul',
age: 23
}
})
父组件:
const studentRef = ref()
// 使用子组件的属性
onMounted(()=>{
console.log(studentRef.value.studentName)
console.log(studentRef.value.obj)
})
全部代码:
子组件:
<template>
<div>Hello World</div>
<p>我的学校的名字是:{{ schoolName }}</p>
<hr />
<p>我的学校改名了:{{}}</p>
<button @click="changeName">点击改名</button>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const props = defineProps({
schoolName: {
type: String,
default: 'error'
}
})
// 事件声明
const emit = defineEmits(['changeSchoolName'])
const changeName = (): void => {
emit('changeSchoolName','传递成功')
}
// 子组件中暴露属性,可以在父组件中通过ref来访问到
const studentName = ref('tom')
defineExpose({
studentName,
obj: {
name: 'paul',
age: 23
}
})
</script>
<style></style>
父组件:
<template>
<!-- 父传子 -->
<student
:schoolName="schoolName"
@changeSchoolName="changeName"
ref="studentRef"
></student>
</template>
<script lang="ts" setup>
import Student from './Student.vue'
import { ref,onMounted } from 'vue'
const schoolName = ref('xxx')
// 子传父,然后父再传给子
const changeName = (params:string): void => {
console.log(params);
schoolName.value = 'good'
}
const studentRef = ref()
// 使用子组件的属性
onMounted(()=>{
console.log(studentRef.value.studentName)
console.log(studentRef.value.obj)
})
</script>
<style></style>