vue 组合式函数封装
核心代码
ts
import {unref, watch} from "vue";
export const useEventListener = (...args) => {
const target = typeof args[0] === 'string' ? window : args.shift()
return watch(
() => unref(target),
(element, _, onCleanup) => {
if (!element) return;
element.addEventListener(...args)
onCleanup(() => {
element.removeEventListener(...args)
})
},
{
immediate: true
}
)
}使用 Demo
vue
<template>
<div ref="containerRef" class="container"/>
</template>
<script lang="ts" setup>
import {useTemplateRef} from "vue";
import {useEventListener} from "@/components/useEventListener.ts";
const containerRef = useTemplateRef('containerRef')
const move = () => {
console.count('move')
}
const off = useEventListener('mousemove', move)
setTimeout(() => {
off()
}, 1000)
</script>
<style scoped>
.container {
width: 200px;
height: 200px;
background: #181818;
}
</style>