本文已参与「新人创作礼」活动,一起开启掘金创作之路
1. 环境配置:
vscode
TS
"bootstrap": "^5.1.3",
"core-js": "^3.6.5",
"vue": "^3.0.0",
"vue-class-component": "^8.0.0-0"
2. 代码:
useOutclick.TS
import { ref, onMounted, onUnmounted, Ref } from 'vue'
const useClickOutside = (elementRef: Ref<null | HTMLElement>) => {
const isClickOutside = ref(false)
const handler = (e:MouseEvent) => {
if (elementRef.value) {
if (elementRef.value.contains(e.target as HTMLElement)) {
isClickOutside.value = false
} else {
isClickOutside.value = true
}
}
}
onMounted(() => {
document.addEventListener('click', handler)
})
onUnmounted(() => {
document.removeEventListener('click', handler)
})
return isClickOutside
}
export default useClickOutside
需要解决判断点击的是哪一个部分
就涉及到关于Vue虚拟DOM、树、节点的内容了。
浏览器工作原理:
浏览器是通过监控整个由DOM节点构成的树来监听整个页面的。
if (elementRef.value.contains(e.target as HTMLElement)) {
isClickOutside.value = false
} else {
isClickOutside.value = true
}
判断元素是不是点击的DOM节点。然后给导出的ref变量赋值,做点击判断的target。
3. 运行结果:
-
点击前:
-
点击后: