我正在尝试学习使用TypeScript的API,特别是如何使用严格类型化的有效负载发出事件。
下面我有一个例子,但我不确定它是否正确,所以我的问题是,是否有其他方法来发射具有严格类型负载的事件?
示例
我用了这个套餐:https://www.npmjs.com/package/vue-typed-emit,并让它与下面的例子一起工作,在这个例子中,我将一个布尔值从一个子组件传递给父组件:
子组件:
<script lang="ts">
import { defineComponent, ref, watch } from 'vue'
import { CompositionAPIEmit } from 'vue-typed-emit'
interface ShowNavValue {
showNavValue: boolean
}
interface ShowNavValueEmit {
emit: CompositionAPIEmit<ShowNavValue>
}
export default defineComponent({
name: 'Child',
emits: ['showNavValue'],
setup(_: boolean, { emit }: ShowNavValueEmit) {
let showNav = ref<boolean>(false)
watch(showNav, (val: boolean) => {
emit('showNavValue', val)
})
return {
showNav
}
}
})
</script>
父组件
<template>
<div id="app">
<Child @showNavValue="toggleBlurApp" />
<div :class="{'blur-content': blurApp}"></div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import Child from './components/Child.vue';
export default defineComponent({
name: 'Parent',
components: {
Child
},
setup() {
let blurApp = ref<boolean>(false);
let toggleBlurApp = (val: boolean) => {
blurApp.value = val;
}
return {
blurApp,
toggleBlurApp
}
}
});
</script>
<style lang="scss">
.blur-content{
filter: blur(5px);
transition : filter .2s linear;
}
</style>
4条答案
按热度按时间sqougxex1#
Vue
<script setup>
编译器宏,用于声明组件发出的事件。预期参数与组件emits
选项相同。运行时声明示例:
基于类型的减量示例:
这只能在
<script setup>
中使用,在输出中编译掉,并且不应该在运行时实际调用。kyks70gy2#
安装vue-typed-emit是不必要的,可以使用以下方法替换:首先,您可以定义您希望事件符合的接口,其中事件键是“event”,类型是事件的发出类型“args”。
然后,您可以从vue导入并使用现有的SetupContext接口,并定义一个扩展,对emit函数参数添加限制。
此接口本质上用emit函数替换了现有的
emit(event: string, args: any) => void
,该函数接受“event”作为“Events”接口的键,并接受其对应的类型作为“args”。我们现在可以在组件中定义设置函数,用SetupContextExtended替换SetupContext,并传入'Events'接口。
工作部件:
现在要使此扩展类型在所有现有和将来的组件中可用-然后您可以增强vue模块本身,以便在现有导入中包含此自定义SetupContextExtended接口。对于本例,它将添加到shims-vue.d.ts中,但如果需要,您应该能够将其添加到专用文件中。
带有增强vue模块的最终组件:
我使用这个接口在父组件中定义并导出Events接口,然后将其导入到子组件中,这样父组件就定义了控制子组件的发射事件的契约
5kgi1eie3#
如果你使用的是
<script setup>
,那么使用defineEmits
(正如guangzan的回答所建议的那样)就可以了。官方文档的链接在这里:https://vuejs.org/guide/typescript/composition-api.html#typing-component-emits但是,如果您喜欢使用
<script lang="ts">
和setup
函数,那么基本上有两个选项可以指定强类型事件有效负载。请看Kiaan Edge-Ford给出的精彩答案。如果您想在多个组件上重复使用并强制执行相同的事件,此选项可能会很合适。
官方的Vue文档目前还不清楚,但
emits:
实际上已经有了一种额外的形式,它可以是函数的对象,而不是字符串数组,所以可以这样翻译:变成了这样
您可能需要也可能不需要eslint注解来防止警告。这里的函数是一个验证函数,所以
return true
在这里的意思是:始终有效。现在,当关联的
emit(...)
函数没有发送正确的有效负载时,您的环境应该会发出警告。tct7dpnv4#
我正在使用
<script setup lang="ts">
,并强输入AND来验证emit的有效负载,如下所示:然后发出如下事件:
如果我只想声明和输入上面的emit,我会这样做: