共计 1050 个字符,预计需要花费 3 分钟才能阅读完成。
如果一个子组件应用的是选项式 API 或没有应用 <script setup>
,被援用的组件实例和该子组件的 this
完全一致,这意味着父组件对子组件的每一个属性和办法都有齐全的拜访权。这使得在父组件和子组件之间创立严密耦合的实现细节变得很容易,当然也因而,应该只在相对须要时才应用组件援用。大多数状况下,你应该首先应用规范的 props 和 emit 接口来实现父子组件交互。
有一个例外的状况,应用了 <script setup>
的组件是 默认公有 的:一个父组件无法访问到一个应用了 <script setup>
的子组件中的任何货色,除非子组件在其中通过 defineExpose
宏显式裸露:
<script setup> | |
import {ref} from 'vue' | |
const a = 1 | |
const b = ref(2) | |
// 像 defineExpose 这样的编译器宏不须要导入 | |
defineExpose({ | |
a, | |
b | |
}) | |
</script> |
当父组件通过模板援用获取到了该组件的实例时,失去的实例类型为 {a: number, b: number}
(ref 都会主动解包,和个别的实例一样)。
为组件模板援用标注类型
有时,你可能须要为一个子组件增加一个模板援用,以便调用它公开的办法。举例来说,咱们有一个 MyModal
子组件,它有一个关上模态框的办法:
<!-- MyModal.vue --> | |
<script setup lang="ts"> | |
import {ref} from 'vue' | |
const isContentShown = ref(false) | |
const open = () => (isContentShown.value = true) | |
defineExpose({open}) | |
</script> |
为了获取 MyModal
的类型,咱们首先须要通过 typeof
失去其类型,再应用 TypeScript 内置的 InstanceType
工具类型来获取其实例类型:
<!-- 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> |
留神,如果你想在 TypeScript 文件而不是在 Vue SFC 中应用这种技巧,须要开启 Volar 的 Takeover 模式。
本文由博客一文多发平台 OpenWrite 公布!
正文完
发表至: javascript
2023-08-26