'Vue Composition API: Defining emits
When defining custom events Vue encourages us to define emitted events on the component via the emits option:
app.component('custom-form', {
emits: ['inFocus', 'submit']
})
Using Vue 3's composition API, when a standalone composition function emits custom events, is it possible to define these in the composition function?
Solution 1:[1]
I did it like this with the script setup syntax:
<script setup>
import { defineEmits } from 'vue'
const emit = defineEmits(['close'])
const handleClose = () => {
emit('close')
}
</script>
Solution 2:[2]
If you want to get all the context:
setup(props, context) {
// console.log(context)
context.emit("update:modelValue", data)
},
Solution 3:[3]
If you are using script setup you can use defineEmits which is a compiler macros and you don't have to import it:
<script setup>
const emit = defineEmits(['inFocus', 'submit'])
emit('inFocus')
</script>
You can also use an object syntax, which allows performing events validation:
<script setup>
const emit = defineEmits({
// No validation
inFocus: null,
// Validate submit event
submit: ({ email, password }) => {
if (email && password) return true
else return false
}
})
function submitForm(email, password) {
emit('submit', { email, password })
}
</script>
Note: the submit event will be emitted regardless of validation but if the validation doesn't pass, you will get a Vue warning:
[Vue warn]: Invalid event arguments: event validation failed for event "submit".
Typing with TS:
<script setup lang="ts">
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
</script>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | David Wolf |
| Solution 2 | David Wolf |
| Solution 3 | Roland |
