日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

20行代碼,封裝一個 React 圖片懶加載組件

來源: 責編: 時間:2024-03-20 08:50:18 273觀看
導讀一、如何判斷圖片進入視口我們可以使用傳統(tǒng)的方式,監(jiān)聽頁面的 scroll 事件,然后調用目標函數的 getBoundingClientRect 方法,得到目標元素在網頁中的位置信息。但是我并不喜歡監(jiān)聽 scroll 事件。因為他會大量的執(zhí)行,并且

nIg28資訊網——每日最新資訊28at.com

一、如何判斷圖片進入視口

我們可以使用傳統(tǒng)的方式,監(jiān)聽頁面的 scroll 事件,然后調用目標函數的 getBoundingClientRect 方法,得到目標元素在網頁中的位置信息。nIg28資訊網——每日最新資訊28at.com

但是我并不喜歡監(jiān)聽 scroll 事件。因為他會大量的執(zhí)行,并且 getBoundingClientRect 是一個同步方法,都在主線程上運行,當其頻繁執(zhí)行時可能會導致性能出現問題。nIg28資訊網——每日最新資訊28at.com

我們可以使用另外一種方式來做到同樣的效果。他就是 IntersectionObserver。nIg28資訊網——每日最新資訊28at.com

var observer = new IntersectionObserver(callback[, option])

IntersectionObserver 提供了一種異步觀察目標元素與其祖先元素或者頂級文檔 viewport 交叉狀態(tài)的方法。其祖先元素或者視口,被稱為根 root。當目標元素與根元素在視圖上產生交集時,回調函數就會執(zhí)行。nIg28資訊網——每日最新資訊28at.com

我們也可以在 options 中,自定義配置 root 元素。nIg28資訊網——每日最新資訊28at.com

let options = {  root: document.querySelector("#scrollArea"),  rootMargin: "0px",  threshold: 1.0,};let observer = new IntersectionObserver(callback, options);

options 接受三個參數。nIg28資訊網——每日最新資訊28at.com

root

自定義目標元素的根節(jié)點。該節(jié)點必須是目標元素的祖先元素。如果未指定,默認為視口。nIg28資訊網——每日最新資訊28at.com

rootMargin

根元素周圍的邊距。其值可以類似于 CSS 的 margin 屬性,例如 10px 20px 30px 40px,以此表示上、右、下、左。這些值夜可以是百分比。在計算交叉點之前,這組值用于增大或者縮小根元素邊框的每一側,默認為 0。nIg28資訊網——每日最新資訊28at.com

threshold

一個數字或者一組數字。表示目標可見度達到多少百分比時,回調函數就應該執(zhí)行。例如,如果我希望交叉部分每超過目標元素 25% 就執(zhí)行,那么我就傳入 [0, 0.25, 0.5, 0.75, 1]. 默認值為 0。nIg28資訊網——每日最新資訊28at.com

創(chuàng)建的實例有 4 個方法可以讓我們使用。nIg28資訊網——每日最新資訊28at.com

  • observer.disconnect() 停止監(jiān)聽。
  • observer.observe(element) 開始監(jiān)聽目標元素。
  • observer.takRecords() 返回所有目標元素的信息對象數組。
  • observer.unobserve(element)停止監(jiān)聽目標元素。

回調函數執(zhí)行時,接收一個參數,該參數為回調函數提供目標對象的位置信息,一共有六個屬性。nIg28資訊網——每日最新資訊28at.com

{  // 回調執(zhí)行的時間  time: 3893.92,    // 被觀察的目標對象  target: element    // 根元素位置信息  rootBounds: ClientRect {    bottom: 920,    height: 1024,    left: 0,    right: 1024,    top: 0,    width: 920  },    // 目標元素位置信息  boundingClientRect: ClientRect {     // ...  },    // 交叉區(qū)域矩形的位置大小信息  intersectionRect: ClientRect {    // ...  },    // 元素可見度比例  intersectionRatio: 0.54,}

該參數返回一個數組包含一個或者多個元素的位置信息。nIg28資訊網——每日最新資訊28at.com

二、圖片懶加載原理

在瀏覽器中,展示一張圖片,我們使用的是 img 標簽。img 標簽有一個必須傳入的屬性 src,當我們不傳入 src 時,圖片無法加載,一旦傳入 src,那么圖片就會立即開始加載。nIg28資訊網——每日最新資訊28at.com

因此,我們需要做的事情就是,當圖片沒有出現在可視區(qū)域時,不傳入正確的 src 屬性,當通過上述的方法判斷圖片已經出現在可視區(qū)域,我們就傳入正確的 src,此時圖片會立即加載。nIg28資訊網——每日最新資訊28at.com

三、代碼實現

首先,我們封裝的新組件,一定要繼承原有 img 標簽的所有能力。先定義一個 Props 類型聲明,目前我們并不需要擴展其他的屬性,暫時先這樣,未來會根據需求的變動逐漸新增新的屬性值。nIg28資訊網——每日最新資訊28at.com

interface LazyLoadProps extends DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement> {  }

然后我們我要的事情是,除了 src 屬性,我們要把其他屬性全部直接傳給 img 標簽,具體方式如下:nIg28資訊網——每日最新資訊28at.com

export default function LazyLoad(props: LazyLoadProps) {  const {src = '', ...other} = props    return (    <img {...other} />  )}

然后我們需要定義一個 ref 屬性,用于獲取 img 標簽的元素對象。nIg28資訊網——每日最新資訊28at.com

export default function LazyLoad(props: LazyLoadProps) {  const {src = '', ...other} = props  const img = useRef(null)  return (    <img ref={img} {...other} />  )}

準備工作做好之后,我們最后只需要借助 useEffect 聲明 IntersectionObserver 實例然后監(jiān)聽圖片元素即可。nIg28資訊網——每日最新資訊28at.com

export default function LazyLoad(props: LazyLoadProps) {  const {src = '', ...other} = props  const [URL, setURL] = useState('')  const img = useRef(null)  useEffect(() => {    var io = new IntersectionObserver((entries) => {      // @ts-ignore      if (entries[0].intersectionRatio > 0) {        setURL(src)        img.current && io.unobserve(img.current)      }    }, {})       if (img.current) {      io.observe(img.current)    }  }, [])  return (    <img ref={img} src={URL} {...other} />  )}

這樣,一個滿足基本要求的圖片懶加載組件就封裝好了。nIg28資訊網——每日最新資訊28at.com

四、擴展思考

在我們做首屏優(yōu)化的時候,為了能夠達到最快的速度渲染頁面,圖片的加載往往也需要延后,但是又不能延后太多。因此此時的問題是,圖片已經出現在可視區(qū)域了,我們又應該如何做才能做到懶加載呢?nIg28資訊網——每日最新資訊28at.com

在實踐中可能還會遇到的需求變動是,給圖片添加一個占位符。然后占位符元素與圖片元素的切換不是立即發(fā)生的,而是要等到我們確保圖片已經全部加載完成之后才發(fā)生的,否則的話,可能會出現圖片只加載了一小半的視圖情況。這又應該如何實現nIg28資訊網——每日最新資訊28at.com

繼續(xù)優(yōu)化。我們希望占位符元素與圖片元素的切換沒那么生硬,而是結合動畫漸入漸出,又該如何實現。nIg28資訊網——每日最新資訊28at.com

繼續(xù)優(yōu)化,我們希望支持傳入 aspectFill 等屬性,確保圖片的縮放比例,不能因為寬高的設置導致圖片比例變形,又該如何實現nIg28資訊網——每日最新資訊28at.com

這些思考就留給大家在實踐中去嘗試驗證了。本文就不在詳細介紹。nIg28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-77981-0.html20行代碼,封裝一個 React 圖片懶加載組件

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Kotlin的擴展(Extension)特性,你了解了嗎?

下一篇: 我們一起解鎖小程序開發(fā)新姿勢

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产伦精品一区二区三区视频孕妇| 久久女同精品一区二区| 亚洲国产精品精华液网站| 亚洲国产精品久久久久婷婷884| 亚洲日韩欧美一区二区在线| 亚洲视频精选在线| 欧美一区二区在线播放| 美女网站在线免费欧美精品| 国产精品一区二区a| 国产香蕉久久精品综合网| 亚洲第一伊人| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久精品国产久精国产思思| 亚洲一级片在线看| 欧美一级一区| 欧美成人免费一级人片100| 欧美三级欧美一级| 国产一区视频在线观看免费| 亚洲精品免费观看| 欧美一区2区视频在线观看| 欧美电影打屁股sp| 国产精品一区在线观看| 亚洲国产另类久久精品| 亚洲欧美日韩精品综合在线观看 | 国产日韩专区| 亚洲欧洲精品一区| 午夜宅男欧美| 欧美激情一区二区久久久| 免费在线亚洲欧美| 美日韩精品免费| 国产精品久久久久毛片大屁完整版| 黄色亚洲网站| 亚洲尤物影院| 欧美激情在线| 韩日视频一区| 亚洲欧美成人| 久久国产精品一区二区三区四区| 欧美精品三级在线观看| 国产亚洲aⅴaaaaaa毛片| 一本色道综合亚洲| 母乳一区在线观看| 国产一区二区在线观看免费播放| 一本色道久久88精品综合| 久热精品视频在线观看| 国产精品一区二区a| 一区二区三区欧美日韩| 美女主播精品视频一二三四| 国产欧美视频一区二区| 一区二区电影免费在线观看| 免费在线国产精品| 红桃av永久久久| 午夜视频一区二区| 欧美午夜精品理论片a级大开眼界| 91久久久久久久久| 久久综合九九| 国产综合色产在线精品| 亚洲高清一区二区三区| 亚洲人体大胆视频| 久久爱www久久做| 欧美大片va欧美在线播放| 国产一区二区在线观看免费播放| 亚洲欧美日本视频在线观看| 欧美一区综合| 欧美午夜无遮挡| 99国内精品久久久久久久软件| 免播放器亚洲| 伊人成年综合电影网| 久久福利精品| 国产日韩av在线播放| 在线观看欧美日本| 亚洲精品一二三区| 免费观看一级特黄欧美大片| 黄色成人在线网址| 中文高清一区| 欧美日韩免费一区二区三区视频 | 久久精品女人| 好吊色欧美一区二区三区四区| 午夜久久久久久| 国产毛片一区二区| 欧美一级黄色网| 国产午夜精品美女视频明星a级| 性8sex亚洲区入口| 国产婷婷成人久久av免费高清 | 亚洲专区免费| 免费在线成人av| 亚洲第一福利社区| 久热精品视频在线观看一区| 亚洲国产精品国自产拍av秋霞| 麻豆成人在线播放| 91久久精品国产91久久| 欧美激情成人在线| 99精品热视频| 国产精品女人网站| 欧美一级视频| 国产一区免费视频| 久色成人在线| 亚洲高清二区| 欧美精品精品一区| 亚洲天堂成人在线观看| 国产精品亚洲а∨天堂免在线| 欧美一级播放| 韩国av一区二区三区在线观看| 久久一区二区三区国产精品| 亚洲精品国偷自产在线99热| 欧美日韩日本视频| 亚洲自拍啪啪| 韩国精品主播一区二区在线观看| 裸体丰满少妇做受久久99精品| 国产精品欧美久久| 午夜精品免费视频| 韩国视频理论视频久久| 欧美va天堂va视频va在线| 99伊人成综合| 国产伦精品一区| 久热爱精品视频线路一| 日韩午夜三级在线| 国产精品视频精品| 久久久蜜臀国产一区二区| 亚洲毛片视频| 国产精品一级| 久久免费视频观看| 99视频在线精品国自产拍免费观看 | 亚洲国产精品激情在线观看| 欧美日韩国产精品自在自线| 亚洲欧美日韩精品一区二区| 尤物yw午夜国产精品视频明星| 欧美激情一区二区三区成人| 亚洲自拍偷拍网址| 欲香欲色天天天综合和网| 欧美日韩成人综合在线一区二区| 亚洲综合精品一区二区| 在线看片日韩| 国产精品白丝av嫩草影院| 一区二区欧美视频| 国产无一区二区| 欧美成人精品一区二区| 亚洲一二三四久久| 在线观看亚洲视频| 欧美不卡高清| 亚洲欧美激情视频在线观看一区二区三区 | 久久综合久色欧美综合狠狠| 99精品国产99久久久久久福利| 国产精品日韩一区二区| 免费永久网站黄欧美| 亚洲欧美日韩一区二区在线| 亚洲国产精品视频一区| 国产精品热久久久久夜色精品三区 | 亚洲一区二区免费在线| 一区在线免费观看| 国产精品乱码久久久久久| 蜜桃av一区二区三区| 午夜亚洲性色福利视频| 亚洲美女中文字幕| 一区精品在线| 国产麻豆综合| 国产精品成av人在线视午夜片| 免费成人av在线看| 欧美影院成年免费版| 一区二区三区黄色| 亚洲韩国日本中文字幕| 国产一区二区高清不卡| 国产精品盗摄一区二区三区| 欧美福利视频网站| 久久久久国产精品一区| 亚洲第一综合天堂另类专| 国产精品国产精品| 欧美激情一区二区久久久| 久久九九热re6这里有精品| 亚洲欧美国产制服动漫| 日韩一级精品| 亚洲国产精品精华液2区45| 国产亚洲欧美激情| 国产精品视频精品视频| 欧美午夜不卡影院在线观看完整版免费| 噜噜噜在线观看免费视频日韩| 欧美在线视频导航| 亚洲欧美日韩在线播放| 国产精品99久久久久久久女警| 亚洲欧洲精品成人久久奇米网| 欧美激情中文字幕在线| 久久精品亚洲一区| 亚洲欧洲精品一区| 影音先锋日韩有码| 国产一区二区三区黄| 国产欧美日韩一区二区三区| 国产精品成人v| 欧美深夜福利| 欧美图区在线视频| 欧美视频三区在线播放| 欧美日韩精品综合| 欧美日本韩国在线| 欧美精品一区在线观看| 欧美激情一区二区三区在线| 欧美激情精品久久久久久| 欧美成人中文字幕| 欧美国产亚洲视频| 欧美大尺度在线观看| 欧美成人精品h版在线观看| 欧美风情在线观看| 欧美精品久久99久久在免费线| 欧美精品成人| 欧美日韩国产综合视频在线| 欧美日韩第一区| 欧美视频一区二区|