我们可以使用 @vueuse/core 中的 useIntersectionObserver 来实现监听进入可视区域行为,但是必须配合vue3.0的组合API的方式才能实现。
基于vue3.0和 useIntersectionObserver 封装图片懒加载指令
import defaultImg from '@/assets/images/200.png'
import { useIntersectionObserver } from '@vueuse/core'
// 指令
const defineDirective = (app) => {
app.directive('lazy', {
// 标签或组件挂载到页面中(就是 Vue2 insert 插入节点)
mounted (el, { value }) {
// stop 是一个函数,用于停止检测元素可见性
const { stop } = useIntersectionObserver(
el,
// isIntersecting 布尔值,元素可见为 true,元素不可见为 false
([{ isIntersecting }], observerElement) => {
// 图片标签是否可见
if (isIntersecting) {
// 如果目标可见,替换图片地址,自动加载图片
el.src = value
// 如果图片地址是错误的,无法加载图片,显示占位图
el.onerror = () => {
el.src = defaultImg
}
// 主动停止检测元素可见性
stop()
}
})
}
})
}