react實(shí)現(xiàn)圖片懶加載的三種方式
在 React 中實(shí)現(xiàn)圖片懶加載可以提升頁(yè)面的性能,特別是在有大量圖片的頁(yè)面中,能避免一次性加載所有圖片導(dǎo)致的性能問(wèn)題。以下為你介紹幾種常見(jiàn)的實(shí)現(xiàn)方式:
1. 使用 HTML 的 loading="lazy" 屬性
現(xiàn)代瀏覽器原生支持圖片的懶加載,通過(guò)給 <img> 標(biāo)簽添加 loading="lazy" 屬性即可實(shí)現(xiàn)。
import React from 'react';
const LazyImage = () => {
return (
<img
src="https://example.com/image.jpg"
alt="Lazy loaded image"
loading="lazy"
/>
);
};
export default LazyImage;優(yōu)點(diǎn):
- 簡(jiǎn)單易用,無(wú)需額外的庫(kù)。
- 瀏覽器原生支持,兼容性較好。
缺點(diǎn):
- 對(duì)于舊版本的瀏覽器可能不支持。
2. 使用 react-lazyload 庫(kù)
react-lazyload 是一個(gè)常用的 React 懶加載庫(kù),它可以幫助你輕松實(shí)現(xiàn)圖片懶加載。
npm install react-lazyload
使用示例
import React from 'react';
import LazyLoad from 'react-lazyload';
const LazyImage = () => {
return (
<LazyLoad>
<img
src="https://example.com/image.jpg"
alt="Lazy loaded image"
/>
</LazyLoad>
);
};
export default LazyImage;自定義配置
react-lazyload 提供了一些配置選項(xiàng),例如 threshold(觸發(fā)加載的閾值)、placeholder(加載前的占位符)等。
import React from 'react';
import LazyLoad from 'react-lazyload';
const LazyImage = () => {
return (
<LazyLoad
threshold={200}
placeholder={<div>Loading...</div>}
>
<img
src="https://example.com/image.jpg"
alt="Lazy loaded image"
/>
</LazyLoad>
);
};
export default LazyImage;優(yōu)點(diǎn):
- 功能豐富,提供了多種配置選項(xiàng)。
- 兼容性好,支持舊版本的瀏覽器。
缺點(diǎn):
- 需要引入額外的庫(kù),增加了項(xiàng)目的體積。
3. 使用 IntersectionObserver API 手動(dòng)實(shí)現(xiàn)
IntersectionObserver 是一個(gè)原生的 JavaScript API,用于觀察目標(biāo)元素與視口的交叉狀態(tài)??梢岳盟謩?dòng)實(shí)現(xiàn)圖片懶加載。
import React, { useRef, useEffect } from 'react';
const LazyImage = () => {
const imgRef = useRef(null);
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
if (imgRef.current) {
observer.observe(imgRef.current);
}
return () => {
if (imgRef.current) {
observer.unobserve(imgRef.current);
}
};
}, []);
return (
<img
ref={imgRef}
data-src="https://example.com/image.jpg"
alt="Lazy loaded image"
src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
/>
);
};
export default LazyImage;優(yōu)點(diǎn):
- 無(wú)需引入額外的庫(kù),減少項(xiàng)目體積。
- 可以根據(jù)需求進(jìn)行自定義。
缺點(diǎn):
- 代碼實(shí)現(xiàn)相對(duì)復(fù)雜。
- 對(duì)于舊版本的瀏覽器可能需要使用 polyfill。
到此這篇關(guān)于react實(shí)現(xiàn)圖片懶加載的三種方式的文章就介紹到這了,更多相關(guān)react 圖片懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React如何使用create-react-app創(chuàng)建react項(xiàng)目
這篇文章主要介紹了React如何使用create-react-app創(chuàng)建react項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
關(guān)于antd tree和父子組件之間的傳值問(wèn)題(react 總結(jié))
這篇文章主要介紹了關(guān)于antd tree 和父子組件之間的傳值問(wèn)題,是小編給大家總結(jié)的一些react知識(shí)點(diǎn),本文通過(guò)一個(gè)項(xiàng)目需求實(shí)例代碼詳解給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06
用React實(shí)現(xiàn)一個(gè)完整的TodoList的示例代碼
本篇文章主要介紹了用React實(shí)現(xiàn)一個(gè)完整的TodoList的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
React實(shí)現(xiàn)組件間通信的幾種方式小結(jié)
在React應(yīng)用中,組件間的通信是一個(gè)基礎(chǔ)而關(guān)鍵的概念,理解和掌握不同組件之間的通信方式,可以幫助我們構(gòu)建出更加模塊化、可維護(hù)和可擴(kuò)展的應(yīng)用程序,React提供了多種組件通信的方法,本文給大家詳細(xì)的介紹了這些方法,需要的朋友可以參考下2024-07-07

