1.组件的 emits 标注类型
java
<script setup lang="ts">
// 运行时
const emit = defineEmits(['change', 'update'])
// 基于选项
const emit = defineEmits({
change: (id: number) => {
// 返回 `true` 或 `false`
// 表明验证通过或失败
},
update: (value: string) => {
// 返回 `true` 或 `false`
// 表明验证通过或失败
}
})
// 基于类型
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
// 3.3+: 可选的、更简洁的语法
const emit = defineEmits<{
change: [id: number]
update: [value: string]
}>()
</script>
2.为 provide / inject 标注类型
java
import { provide, inject } from 'vue'
import type { InjectionKey } from 'vue'
const key = Symbol() as InjectionKey<string>
provide(key, 'foo') // 若提供的是非字符串值会导致错误
const foo = inject(key) // foo 的类型:string | undefined
2.1:tip:建议将注入 key 的类型放在一个单独的文件中,这样它就可以被多个组件导入,可以添加如页面结构上的文件夹 types --->typesData.ts,使用 export 导出。
3.defineExpose 组件:子传父
3.1当你可能需要为一个子组件添加一个模板引用,以便调用它公开的方法。举例来说,我们有一个 MyModal 子组件,它有一个打开模态框的方法:
java
<!-- 子组件 MyModal.vue -->
<script setup lang="ts">
import { ref } from 'vue'
const isContentShown = ref(false)
const open = () => (isContentShown.value = true)
defineExpose({
open
})
</script>
<!--父组件 App.vue -->
<script setup lang="ts">
import MyModal from './MyModal.vue'
const modal = ref<InstanceType<typeof MyModal> | null>(null)
const openModal = () => {
modal.value?.open()
}
</script>
3.2当你是传值时
java
<!-- 父组件.vue -->
<Index ref="childeRef"></Index>
<script setup>
import Index from "./index.vue";
const childeRef = ref();
function test() {
console.log(childeRef.value.msg) // Hello World
}
onMounted(() => {
let flag:boolean = true;
let value:number= 5;
childeRef.value.childFn(flag,value) // 调用子组件函数, 输出 6
})
</script>
<!-- 子组件.vue -->
<script setup>
import {ref} from "vue";
function childFn(type:boolean, data:number) {
console.log('我是子组件');
if(data){
let value = data + 1;
return value;
}
}
const msg = 'Hello World';
const num = ref(0);
defineExpose({ //暴露想要传递的值或方法
msg,
childFn,
});
</script>