Subchapter 18.119
references/useEventListener.mdMarkdown7 KBView on GitHub
Use EventListener with ease. Register using addEventListener on mounted, and automatically on unmounted.
import { useEventListener } from '@vueuse/core'
useEventListener(document, 'visibilitychange', (evt) => {
console.log(evt)
})When the target is omitted, it defaults to window:
import { useEventListener } from '@vueuse/core'
// Listens on window
useEventListener('resize', (evt) => {
console.log(evt)
})You can pass a ref as the event target, useEventListener will unregister the previous event and register the new one when the target changes.
<script setup lang="ts">
import { useEventListener } from '@vueuse/core'
import { useTemplateRef } from 'vue'
const element = useTemplateRef('element')
useEventListener(element, 'keydown', (e) => {
console.log(e.key)
})
</script>
<template>
<div v-if="cond" ref="element">
Div1
</div>
<div v-else ref="element">
Div2
</div>
</template>You can pass an array of events to listen to multiple events at once:
import { useEventListener } from '@vueuse/core'
useEventListener(document, ['mouseenter', 'mouseleave'], (evt) => {
console.log(evt.type)
})You can also pass an array of targets:
import { useEventListener } from '@vueuse/core'
const buttons = document.querySelectorAll('button')
useEventListener(buttons, 'click', (evt) => {
console.log('Button clicked')
})Returns a cleanup function to manually unregister the listener:
import { useEventListener } from '@vueuse/core'
const cleanup = useEventListener(document, 'keydown', (e) => {
console.log(e.key)
})
cleanup() // This will unregister the listener.Note if your components also run in SSR (Server Side Rendering), you might get errors (like document is not defined) because DOM APIs like document and window are not available in Node.js. To avoid that you can put the logic inside onMounted hook.
import { useEventListener } from '@vueuse/core'
// ---cut---
// onMounted will only be called in the client side
// so it guarantees the DOM APIs are available.
onMounted(() => {
useEventListener(document, 'keydown', (e) => {
console.log(e.key)
})
})interface InferEventTarget<Events> {
addEventListener: (event: Events, fn?: any, options?: any) => any
removeEventListener: (event: Events, fn?: any, options?: any) => any
}
export type