精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發(fā) 前端
圖片懶加載是我們在做性能優(yōu)化時非常重要的手段。我們常常需要圖片在進入頁面可視區(qū)域時,才讓加載圖片的行為發(fā)生。

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

我們可以使用傳統(tǒng)的方式,監(jiān)聽頁面的 scroll 事件,然后調(diào)用目標函數(shù)的 getBoundingClientRect 方法,得到目標元素在網(wǎng)頁中的位置信息。

但是我并不喜歡監(jiān)聽 scroll 事件。因為他會大量的執(zhí)行,并且 getBoundingClientRect 是一個同步方法,都在主線程上運行,當其頻繁執(zhí)行時可能會導(dǎo)致性能出現(xiàn)問題。

我們可以使用另外一種方式來做到同樣的效果。他就是 IntersectionObserver。

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

IntersectionObserver 提供了一種異步觀察目標元素與其祖先元素或者頂級文檔 viewport 交叉狀態(tài)的方法。其祖先元素或者視口,被稱為根 root。當目標元素與根元素在視圖上產(chǎn)生交集時,回調(diào)函數(shù)就會執(zhí)行。

我們也可以在 options 中,自定義配置 root 元素。

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

let observer = new IntersectionObserver(callback, options);

options 接受三個參數(shù)。

root

自定義目標元素的根節(jié)點。該節(jié)點必須是目標元素的祖先元素。如果未指定,默認為視口。

rootMargin

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

threshold

一個數(shù)字或者一組數(shù)字。表示目標可見度達到多少百分比時,回調(diào)函數(shù)就應(yīng)該執(zhí)行。例如,如果我希望交叉部分每超過目標元素 25% 就執(zhí)行,那么我就傳入 [0, 0.25, 0.5, 0.75, 1]. 默認值為 0。

創(chuàng)建的實例有 4 個方法可以讓我們使用。

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

回調(diào)函數(shù)執(zhí)行時,接收一個參數(shù),該參數(shù)為回調(diào)函數(shù)提供目標對象的位置信息,一共有六個屬性。

{
  // 回調(diào)執(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,
}

該參數(shù)返回一個數(shù)組包含一個或者多個元素的位置信息。

二、圖片懶加載原理

在瀏覽器中,展示一張圖片,我們使用的是 img 標簽。img 標簽有一個必須傳入的屬性 src,當我們不傳入 src 時,圖片無法加載,一旦傳入 src,那么圖片就會立即開始加載。

因此,我們需要做的事情就是,當圖片沒有出現(xiàn)在可視區(qū)域時,不傳入正確的 src 屬性,當通過上述的方法判斷圖片已經(jīng)出現(xiàn)在可視區(qū)域,我們就傳入正確的 src,此時圖片會立即加載。

三、代碼實現(xiàn)

首先,我們封裝的新組件,一定要繼承原有 img 標簽的所有能力。先定義一個 Props 類型聲明,目前我們并不需要擴展其他的屬性,暫時先這樣,未來會根據(jù)需求的變動逐漸新增新的屬性值。

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

然后我們我要的事情是,除了 src 屬性,我們要把其他屬性全部直接傳給 img 標簽,具體方式如下:

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

然后我們需要定義一個 ref 屬性,用于獲取 img 標簽的元素對象。

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

  return (
    <img ref={img} {...other} />
  )
}

準備工作做好之后,我們最后只需要借助 useEffect 聲明 IntersectionObserver 實例然后監(jiān)聽圖片元素即可。

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} />
  )
}

這樣,一個滿足基本要求的圖片懶加載組件就封裝好了。

四、擴展思考

在我們做首屏優(yōu)化的時候,為了能夠達到最快的速度渲染頁面,圖片的加載往往也需要延后,但是又不能延后太多。因此此時的問題是,圖片已經(jīng)出現(xiàn)在可視區(qū)域了,我們又應(yīng)該如何做才能做到懶加載呢?

在實踐中可能還會遇到的需求變動是,給圖片添加一個占位符。然后占位符元素與圖片元素的切換不是立即發(fā)生的,而是要等到我們確保圖片已經(jīng)全部加載完成之后才發(fā)生的,否則的話,可能會出現(xiàn)圖片只加載了一小半的視圖情況。這又應(yīng)該如何實現(xiàn)

繼續(xù)優(yōu)化。我們希望占位符元素與圖片元素的切換沒那么生硬,而是結(jié)合動畫漸入漸出,又該如何實現(xiàn)。

繼續(xù)優(yōu)化,我們希望支持傳入 aspectFill 等屬性,確保圖片的縮放比例,不能因為寬高的設(shè)置導(dǎo)致圖片比例變形,又該如何實現(xiàn)

這些思考就留給大家在實踐中去嘗試驗證了。本文就不在詳細介紹。

責(zé)任編輯:姜華 來源: 這波能反殺
相關(guān)推薦

2017-03-28 10:11:12

Webpack 2React加載

2025-06-18 10:05:26

2017-03-28 21:03:35

代碼React.js

2019-07-24 16:00:37

Python代碼高清圖片

2020-11-18 09:30:29

圖片懶加載前端瀏覽器

2024-11-08 17:22:22

2024-06-03 00:00:01

2019-04-19 14:40:15

代碼Python機器人

2017-07-19 13:27:44

前端Javascript模板引擎

2014-01-22 09:19:57

JavaScript引擎

2021-06-21 15:49:39

React動效組件

2015-10-08 10:58:51

圖片懶加載

2018-07-12 09:51:04

Python代碼對象模型

2021-03-31 08:01:24

React Portareactcss3

2022-05-13 08:46:46

jsoneditorjson編輯器

2021-03-19 06:31:06

vue-lazyloa圖片懶加載項目

2023-04-10 08:30:30

json編輯器typescript

2023-04-28 09:30:40

vuereact

2023-09-05 20:17:18

typescriptPropTypesreact

2022-01-26 16:30:47

代碼虛擬機Linux
點贊
收藏

51CTO技術(shù)棧公眾號

成人深夜福利app| 日韩av专区| 亚洲妇女屁股眼交7| 精品视频高清无人区区二区三区| 国产免费av一区二区| 奇米狠狠一区二区三区| 欧美精品在线一区二区三区| 国产精品无码免费专区午夜| 日本天堂影院在线视频| 欧美aaaaaa午夜精品| 欧美剧在线观看| 真人bbbbbbbbb毛片| 深夜日韩欧美| 欧美日韩美女视频| 亚洲精品白虎| 天堂网在线中文| 老汉av免费一区二区三区| 久久免费福利视频| 美国精品一区二区| 欧美三级午夜理伦三级在线观看| 欧美日韩高清一区二区不卡| 青青草视频在线免费播放| 日本最新在线视频| www.亚洲国产| 99免费在线观看视频| 69亚洲精品久久久蜜桃小说| 激情欧美亚洲| 日韩在线视频线视频免费网站| 偷偷色噜狠狠狠狠的777米奇| 91九色综合| 欧美日韩中文字幕日韩欧美| 91xxx视频| porn亚洲| 久久影院电视剧免费观看| 成人区精品一区二区| 91禁在线观看| 日韩不卡一区二区| 日本三级久久久| 日本三级免费看| 欧美a级片一区| 久久精品电影网| 亚洲图片第一页| 日韩av系列| 亚洲成人精品视频| 折磨小男生性器羞耻的故事| 欧美中文高清| 538在线一区二区精品国产| 欧美日韩在线成人| 日本韩国欧美| 色94色欧美sute亚洲线路一ni| 你真棒插曲来救救我在线观看| 国产第一页在线视频| 一区二区三区视频在线看| 经典三级在线视频| 麻豆传媒免费在线观看| 国产精品情趣视频| 亚洲一二三区在线| 欧美一区二区三区在线观看免费| 国产清纯在线一区二区www| 欧美日韩精品免费观看| 青春有你2免费观看完整版在线播放高清| 成人午夜激情影院| 国产一区二区三区四区五区在线| 人人妻人人玩人人澡人人爽| 成人午夜视频网站| 久久久久高清| 嫩草精品影院| 国产精品午夜在线| 曰韩不卡视频| 中文字幕有码在线视频| 亚洲成人免费观看| 欧美精品一区免费| 日韩电影大全网站| 欧美色视频在线| 日韩av自拍偷拍| 中文字幕区一区二区三| 亚洲精品久久久久| 成人国产精品久久久网站| 欧美影院三区| 欧美乱妇高清无乱码| 国产一级在线视频| 免费视频一区二区三区在线观看| 国产精品88a∨| 国产又爽又黄免费软件| 国产91富婆露脸刺激对白| 国产欧美一区二区视频| 国产在线资源| 自拍偷自拍亚洲精品播放| av久久久久久| 国产精品av一区二区三区| 欧美日韩午夜在线| 在线xxxxx| 成人在线免费小视频| 久久这里只有精品视频首页| 国产精品黄色网| 日本欧美韩国一区三区| 999久久久| 国产精品99999| 亚洲精品第1页| 久草青青在线观看| 免费欧美网站| 亚洲男人天堂2019| 中文字幕在线有码| 丝袜国产日韩另类美女| 亚洲自拍小视频免费观看| 天堂а在线中文在线无限看推荐| 亚洲欧洲精品一区二区精品久久久| 亚洲 欧美 综合 另类 中字| avav成人| 欧美精品一区二区在线播放| 久久一级免费视频| 一本不卡影院| 51国产成人精品午夜福中文下载 | 不卡一本毛片| 日本韩国欧美国产| 精品熟女一区二区三区| 午夜国产一区二区| 日本在线观看天堂男亚洲| 成人av免费播放| 日韩久久一区二区| 最近中文字幕一区二区| 亚洲精品国产动漫| 久久噜噜噜精品国产亚洲综合| 一级黄色小视频| 国产亚洲短视频| 国内外成人激情视频| 一区二区三区欧洲区| 日韩视频免费在线观看| 中文字幕xxxx| 91美女福利视频| 91九色在线观看视频| 亚洲一区二区三区四区电影| 久久激情视频久久| 一区二区三区午夜| 欧美国产日韩a欧美在线观看| 欧美私人情侣网站| 欧美理论电影在线精品| 国产69精品99久久久久久宅男| 国产区精品在线| ㊣最新国产の精品bt伙计久久| 美女黄色片视频| 免费看日本一区二区| 69久久夜色精品国产69乱青草| 国产黄色一级大片| 亚洲女厕所小便bbb| 欧美成年人视频在线观看| 成人免费在线播放| 国产精品色悠悠| 日本高清在线观看wwwww色| 欧美吞精做爰啪啪高潮| 中文字幕第20页| 视频在线观看91| 日韩精品久久一区| 巨胸喷奶水www久久久| 在线国产精品视频| 91国内精品视频| 亚洲黄色尤物视频| 黄色激情在线观看| 一区二区91| 欧美lavv| 精品国产黄a∨片高清在线| 一区二区三区无码高清视频| 中文字幕一区二区三区波野结 | 精品蜜桃在线看| 国产在线拍揄自揄拍| 波多野结衣91| 激情网站五月天| 国产精品久久久乱弄| 91九色视频在线观看| 51精品视频| 亚洲欧美日韩国产成人| 艳妇乳肉豪妇荡乳av无码福利 | 亚洲午夜在线观看| 久久九九精品视频| 国内揄拍国内精品| 欧美精品少妇| 欧美人牲a欧美精品| 免费在线观看一级片| caoporn国产精品| av免费网站观看| 亚洲破处大片| 久久精品人人做人人爽电影| 成人黄色在线| 欧美大片网站在线观看| 你懂得网站在线| 欧美一区日韩一区| 国产三级av片| 亚洲色图在线播放| 国产精品jizz| 国产老肥熟一区二区三区| 成年人观看网站| 亚洲欧美在线专区| 黑人与亚洲人色ⅹvideos| 久久国产精品一区二区| 热这里只有精品| 大陆精大陆国产国语精品 | a'aaa级片在线观看| 亚洲美女在线视频| 国产乱人乱偷精品视频a人人澡 | 亚洲欧美另类在线视频| 一区在线播放视频| 青青草视频播放| 韩国欧美国产1区| 波多野结衣家庭教师在线播放| 久久在线视频| 久久偷窥视频| 亚洲综合影院| 国产精品网站视频| 咪咪网在线视频| 美女撒尿一区二区三区| 国产日韩精品在线看| 日韩欧美卡一卡二| 国产精品尤物视频| 午夜电影网亚洲视频| 污软件在线观看| 国产人成一区二区三区影院| 色婷婷免费视频| 国产伦精品一区二区三区免费| 91av在线免费播放| 1024日韩| 国产成人亚洲综合无码| 久久国产精品成人免费观看的软件| 精品久久蜜桃| 亚洲一区二区三区四区电影| 国产综合视频在线观看| 欧美片第1页| 97视频在线观看免费| 青草影视电视剧免费播放在线观看| 丝袜亚洲欧美日韩综合| 免费一级毛片在线观看| 欧美精品一区二区高清在线观看| 97人妻精品一区二区三区软件 | 狠狠综合久久av一区二区| 欧美日韩国产精品自在自线| 无码人妻精品一区二区50| 狠狠躁夜夜躁久久躁别揉| 久久视频免费看| 亚洲综合成人网| www.av视频| 亚洲精品日韩综合观看成人91| 美国黄色特级片| 国产欧美1区2区3区| 美女爆乳18禁www久久久久久 | 桃花岛成人影院| 97超碰国产精品女人人人爽 | 国产精品免费一区二区三区都可以| 国产自产自拍视频在线观看 | 欧美影视资讯| 欧美怡红院视频一区二区三区| 精精国产xxx在线视频app| 欧美激情伊人电影| 国产乱码在线| 97国产精品视频人人做人人爱| sm久久捆绑调教精品一区| 久久久人成影片一区二区三区| 日本乱理伦在线| 欧美精品激情在线观看| 大桥未久在线视频| 奇米4444一区二区三区| a一区二区三区| 国产精品国产三级国产aⅴ9色 | 99自拍视频在线观看| 欧美情侣性视频| 多野结衣av一区| 欧美在线亚洲在线| 亚洲成av在线| 国产日韩欧美在线播放| 精品一区视频| 国产欧美日韩综合精品二区| 欧美一区二区三区红桃小说| 欧美三日本三级少妇三99| 久久视频在线| 日本五级黄色片| 免费久久99精品国产自在现线| 午夜精品在线免费观看| 九色|91porny| av天堂一区二区| 国产片一区二区| 成年人一级黄色片| 精品国产999| 中文字幕久久久久| 精品嫩草影院久久| 麻豆app在线观看| 美女性感视频久久久| 一本大道色婷婷在线| 国产美女精品视频| 99这里只有精品视频| 欧美激情第一页在线观看| 国产精品二区不卡| 男女私大尺度视频| 日本欧美一区二区| 亚洲av无码一区东京热久久| 国产欧美一区二区三区在线看蜜臀| √天堂中文官网8在线| 天涯成人国产亚洲精品一区av| 中文字幕精品一区二区精| 精品国产免费人成电影在线观看四季| 男人久久精品| 欧美日韩爱爱视频| 亚洲天堂1区| 成人在线视频电影| 久久中文字幕二区| 激情伊人五月天| 国内精品免费**视频| 国产熟妇搡bbbb搡bbbb| 亚洲精品日韩综合观看成人91| 日韩三级一区二区| 亚洲国产精品电影在线观看| 欧美精品hd| 日本免费久久高清视频| 中文字幕一区二区三区中文字幕 | 国产人妻一区二区| 亚洲韩国一区二区三区| 亚洲天天综合网| 国产视频精品免费播放| 性网站在线观看| 国产精品视频永久免费播放| 青青一区二区| 久久久久久av无码免费网站下载| 免费观看30秒视频久久| 97伦伦午夜电影理伦片| 亚洲午夜在线观看视频在线| 97免费观看视频| 中文字幕久热精品视频在线| 蜜臀久久精品| 国产精品视频入口| 欧美阿v一级看视频| 加勒比av中文字幕| 久久精品日韩一区二区三区| 国产精品久久久久久久妇| 日韩欧美在线影院| av免费在线观看网址| 国产精品夜间视频香蕉| 经典一区二区| 成人在线免费播放视频| 久久午夜免费电影| 欧美日韩综合在线观看| 亚洲精品成人久久| av电影院在线看| 高清视频一区| 激情综合亚洲| 国产伦精品一区三区精东| 尤物视频一区二区| www.国产三级| 日韩在线观看免费| 日产精品一区| 小说区图片区图片区另类灬| 日本不卡123| 亚洲色图 激情小说| 欧美三级中文字幕在线观看| av片在线看| 国产精品视频资源| 欧美第一精品| 91蝌蚪视频在线| 亚洲综合另类小说| 日批免费在线观看| 51ⅴ精品国产91久久久久久| 九九视频精品全部免费播放| 亚洲天堂av线| 亚洲情趣在线观看| а√天堂资源在线| 97热精品视频官网| 国产成人手机高清在线观看网站| 久久黄色免费看| 综合色天天鬼久久鬼色| 性网爆门事件集合av| 97碰在线观看| 狠狠做六月爱婷婷综合aⅴ| 国产区二区三区| 亚洲欧美日韩系列| 日本高清视频在线| 日本视频久久久| 天天做综合网| 奇米777第四色| 在线影视一区二区三区| 调教视频免费在线观看| 97se国产在线视频| 99热这里只有成人精品国产| 日韩毛片无码永久免费看| 欧美人动与zoxxxx乱| 国内小视频在线看| 免费在线观看一区二区| 久久狠狠亚洲综合| 久久网免费视频| 一区二区在线视频| 蜜桃精品视频| 国产xxxxx视频| 亚洲精品日产精品乱码不卡| 亚洲av毛片成人精品| 国产精品一久久香蕉国产线看观看 | 精品久久人人做人人爱| 日本免费久久| 国产精品三级一区二区| 久久久久久久精| 精品国产无码AV| 国产a∨精品一区二区三区不卡| 亚洲色图国产| 一色道久久88加勒比一| 日韩一区二区三区精品视频| 日韩免费电影|