面试题答案
一键面试Vue事件修饰符底层实现原理
Vue事件修饰符是通过在生成的事件处理函数中添加特定逻辑来实现的。例如.prevent
修饰符,在事件处理函数内部调用event.preventDefault()
方法,阻止默认行为;.stop
修饰符则调用event.stopPropagation()
方法,阻止事件冒泡。Vue在编译模板时,会识别这些修饰符,并在生成的渲染函数中注入相应的处理逻辑。
实现自定义事件修饰符 myDebounce
的思路
- 利用Vue自定义指令机制:通过
Vue.directive
定义一个新指令。 - 绑定事件:在指令的
bind
钩子函数中,为元素绑定事件监听器。 - 实现防抖逻辑:使用
setTimeout
和clearTimeout
来控制事件触发频率,根据传入的延迟时间参数决定防抖效果。
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-myDebounce:input="handleInput" :myDebounce="500">
</div>
<script>
Vue.directive('myDebounce', {
bind(el, binding, vnode) {
let timer;
el.addEventListener(binding.arg, () => {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
vnode.context[binding.value]();
}, binding.value || binding.modifiers.myDebounce);
});
}
});
new Vue({
el: '#app',
methods: {
handleInput() {
console.log('Input event triggered with debounce');
}
}
});
</script>
</body>
</html>
在上述代码中:
Vue.directive('myDebounce'
定义了一个名为myDebounce
的自定义指令。bind
钩子函数中,通过addEventListener
为元素绑定事件(事件类型由binding.arg
决定,这里是input
)。- 每次事件触发时,先清除之前的定时器(如果存在),然后根据
binding.value
(即指令绑定时传入的时间参数) 或binding.modifiers.myDebounce
(如果未传入参数,使用默认值) 设置新的定时器来延迟执行实际的事件处理函数vnode.context[binding.value]()
。