使用Intersection Observer接口实现图片懒加载
为img添加自定义属性data-src存储真实的图片地址,等到下拉达到可视区域位置,即isIntersecting为true时就将真实地址赋给src,没有到达则图片地址为默认图片
未达到可视区域,src为默认图片
达到可视区域后,src为真实图片地址
自定义HOOK—useImgHook.js
import { useEffect } from 'react'
/**
* 1,监听图片是否进入可视区域;
* 2,将src属性的值替换为真实的图片地址 --- data-src
* 3,停止监听当前的节点
* @param {*} ele
* @param {*} callback
* @param {*} watch
*/
let observer;
export default function useImgHook(ele, callback, watch) {
useEffect(() => {
//目标元素
const nodes = document.querySelectorAll(ele)
if (nodes && nodes.length) {
observer = new IntersectionObserver((entries) => {
callback && callback(entries)
entries.forEach(item => {
// console.log(item);
if (item.isIntersecting) {
const data_src = item.target.getAttribute('data-src')
//赋值
item.target.setAttribute('src', data_src)
//停止监听目标元素
observer.unobserve(item.target)
}
})
})
nodes.forEach(item => {
observer.observe(item)
})
return () => {
// 停止监听
if (nodes && nodes.length && observer) {
observer.disconnect()
}
}
}
}, watch)
}
使用useImgHook
import { useImgHook } from "@/hook/index.js";
...
// 图片懒加载
useImgHook('.item-img', (entries) => { }, null)
...
{houseList.map((item) => (
<div className='item' key={item.id} >
...
<img alt='img' className='item-img' data-src={item.img} src={require('../../assets/img/blank.png')} />
...
</div>
))}
更多文章可访问 博客
華CG: 有没有人用过,吱个声,有没有用
普通网友: 阅读这篇博文真是一次愉快的体验!作者的文字真是动人心弦,语言精准而生动。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
乌鸦坐滴滴: 通用弹幕库地址 https://bbj.icu/api/danmuTong.html
linlinaichifan: 为啥点开【SQLserver2005_BC_x64.msi】还有很多东西要选择昂,有友友知道如何选择才可以通过最后的环境检测吗