利用IntersectionObserver實(shí)現(xiàn)動(dòng)態(tài)渲染的示例詳解
前言
開發(fā)表格時(shí),希望支持可視后的動(dòng)態(tài)加載。在查找資料做了一些嘗試后,最終使用IntersectionObserver,相對(duì)方便地實(shí)現(xiàn)了該功能
IntersectionObserver誕生已經(jīng)有幾年了,所以它的兼容性目前已經(jīng)達(dá)到可以使用的程度了。具體兼容程度以及詳細(xì)API可參考CDN
實(shí)現(xiàn)
懶加載組件
核心就是利用了IntersectionObserver的能力,封裝了LazyContainer組件,該組件的children,只有在視口中可見時(shí),才會(huì)真正渲染
export const LazyContainer = (props) => {
const { children } = props;
const $ref = useRef<HTMLDivElement>(null);
const [isReady, setReady] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
// 一個(gè)observer可以監(jiān)聽多個(gè)元素,本例中只有一個(gè)
entries.forEach((entry) => {
// isIntersecting:目標(biāo)元素與觀察者元素(一般為視口)是否相交
if (!isReady && entry.isIntersecting) {
setReady(true);
// 首次加載完后,便停止監(jiān)聽
observer.disconnect();
}
});
});
observer.observe($ref.current as Element);
}, []);
return <div ref={$ref}>{isReady ? children : null}</div>;
};長(zhǎng)列表組件示意
簡(jiǎn)潔實(shí)現(xiàn)一個(gè)長(zhǎng)列表,測(cè)試LazyContainer組件
export const LongList = (props) => {
const { loop = 1, children } = props;
return (
<ul>
{Array.from({ length: loop }).map((x, i) => {
return (
<li style={{ height: '200px', marginBottom: '20px' }}>
{React.cloneElement(children, { key: i, num: i })}
</li>
);
})}
</ul>
);
};測(cè)試
在頁(yè)面上測(cè)試一下該功能
<LongList loop={3}>
<LazyContainer num={1}>
{/* 利用img加載做一個(gè)測(cè)試 */}
<img src="圖片地址"></img>
</LazyContainer>
</LongList>在chrome network中開啟slow 3G,然后讓LongList中的元素一個(gè)接一個(gè)出現(xiàn),就可以明顯看到圖片是一個(gè)接一個(gè)進(jìn)行加載的。
到此這篇關(guān)于利用IntersectionObserver實(shí)現(xiàn)動(dòng)態(tài)渲染的示例詳解的文章就介紹到這了,更多相關(guān)IntersectionObserver動(dòng)態(tài)渲染內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jquery實(shí)現(xiàn)select下拉框美化特效代碼分享
這篇文章主要介紹了jquery實(shí)現(xiàn)select下拉框美化特效,實(shí)現(xiàn)效果簡(jiǎn)潔大方,推薦給大家,有需要的小伙伴可以參考下。2015-08-08
axios利用params/data發(fā)送參數(shù)給springboot?controlle的正確獲取方式
這篇文章主要給大家介紹了關(guān)于axios利用params/data發(fā)送參數(shù)給springboot?controlle的正確獲取方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
javascript bom是什么及bom和dom的區(qū)別
BOM是瀏覽器對(duì)象模型,DOM是文檔對(duì)象模型,前者是對(duì)瀏覽器本身進(jìn)行操作,而后者是對(duì)瀏覽器(可看成容器)內(nèi)的內(nèi)容進(jìn)行操作。這篇文章給大家介紹javascript bom是什么及bom和dom的區(qū)別,感興趣的朋友一起學(xué)習(xí)吧2015-11-11
js小數(shù)運(yùn)算出現(xiàn)多位小數(shù)如何解決
關(guān)于JavaScript小數(shù)進(jìn)行加、減、乘、除出現(xiàn)多位小數(shù)問(wèn)題,自己研究了一下,而且作了相關(guān)的測(cè)試,收獲不少知識(shí)點(diǎn),需要的朋友可以參考下2015-10-10
JS.GetAllChild(element,deep,condition)使用介紹
JS.GetAllChild()獲取所有子節(jié)點(diǎn),想必大家都知道吧,具體的使用方法如下,感興趣的朋友可以參考下2013-09-09
Javascript remove 自定義數(shù)組刪除方法
Javascript自定義數(shù)組刪除方法remove(),需要的朋友可以參考下。2009-10-10

