面试题答案
一键面试实现思路
- 监听图片进入视口:使用
IntersectionObserver
API来监听图片元素是否进入视口。当图片进入视口时,开始加载图片。 - 指令绑定:通过Vue自定义指令,在指令绑定到元素时,为元素添加必要的属性和事件监听。
- 处理生命周期钩子:利用指令的不同生命周期钩子函数来初始化、更新和卸载相关功能。
关键代码片段
<template>
<div>
<img v-lazy="imageUrl" alt="Lazy Loaded Image">
</div>
</template>
<script>
export default {
data() {
return {
imageUrl: 'https://example.com/image.jpg'
};
},
directives: {
lazy: {
bind(el, binding) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
el.src = binding.value;
observer.unobserve(el);
}
});
});
observer.observe(el);
}
}
}
};
</script>
处理指令的不同生命周期钩子函数
- bind:
- 功能:在指令第一次绑定到元素时调用。在此钩子函数中,初始化
IntersectionObserver
并开始观察元素。 - 代码:如上述关键代码片段中,在
bind
钩子函数内创建IntersectionObserver
实例并调用observe
方法观察元素。
- 功能:在指令第一次绑定到元素时调用。在此钩子函数中,初始化
- update:
- 功能:当指令的绑定值发生变化时调用。如果图片URL改变,可以在这里重新设置观察或更新图片。
- 代码示例:
update(el, binding) {
el.src = binding.value;
}
- unbind:
- 功能:在指令从元素上解绑时调用。在此钩子函数中,取消
IntersectionObserver
的观察,以避免内存泄漏。 - 代码示例:
- 功能:在指令从元素上解绑时调用。在此钩子函数中,取消
unbind(el) {
const observer = el.__observer__;
if (observer) {
observer.unobserve(el);
}
}
通过以上实现思路、关键代码片段以及对指令生命周期钩子函数的处理,可以实现一个功能完整且兼容性较好的Vue自定义图片懒加载指令。