如何定义 Vue 3 的 emit
How to define Vue's 3 emit
我正在寻找是否可以定义发射类型。在脚本设置中的 SFC 中,我们可以执行 (docs):
<script setup lang="ts">
// runtime
const emit = defineEmits(['change', 'update'])
// type-based
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
</script>
因为我正在寻找一种定义相同事物但基于渲染函数的方法:
export const ComponentA = defineComponent({
props: {...},
setup() {
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
}
})
不幸的是,我收到以下错误 defineEmits() is a compiler-hint helper that is only usable inside <script setup> of a single file component.
。
有没有办法定义触发的事件及其类型?
不,不可能。
你自己说的:
... is compiler-hint helper ... only usable inside of a single file component
您不能从 setup()
中声明发射,但您可以在 setup()
挂钩旁边使用 emits
option,并从上下文参数的 [=14= 访问发射] 属性(即通过 setup()
的第二个参数):
import { defineComponent } from 'vue'
export const ComponentA = defineComponent({
emits: {
change: (id: number) => true,
update: (value: string) => true,
},
setup(props, { emit }) {
// @ts-expect-error
emit('change', 'foo')
// @ts-expect-error
emit('update', 100)
// ok
emit('change', 100)
// ok
emit('update', 'x')
}
})
我正在寻找是否可以定义发射类型。在脚本设置中的 SFC 中,我们可以执行 (docs):
<script setup lang="ts">
// runtime
const emit = defineEmits(['change', 'update'])
// type-based
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
</script>
因为我正在寻找一种定义相同事物但基于渲染函数的方法:
export const ComponentA = defineComponent({
props: {...},
setup() {
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
}
})
不幸的是,我收到以下错误 defineEmits() is a compiler-hint helper that is only usable inside <script setup> of a single file component.
。
有没有办法定义触发的事件及其类型?
不,不可能。
你自己说的:
... is compiler-hint helper ... only usable inside of a single file component
您不能从 setup()
中声明发射,但您可以在 setup()
挂钩旁边使用 emits
option,并从上下文参数的 [=14= 访问发射] 属性(即通过 setup()
的第二个参数):
import { defineComponent } from 'vue'
export const ComponentA = defineComponent({
emits: {
change: (id: number) => true,
update: (value: string) => true,
},
setup(props, { emit }) {
// @ts-expect-error
emit('change', 'foo')
// @ts-expect-error
emit('update', 100)
// ok
emit('change', 100)
// ok
emit('update', 'x')
}
})