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

