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

聊聊React中的隱藏彩蛋功能

開(kāi)發(fā) 前端
本文將向你介紹3個(gè)文檔中未提及的隱藏彩蛋功能。

大家好,我卡頌。

React的代碼量可以說(shuō)是相當(dāng)龐大。在如此龐大的庫(kù)中是否存在「文檔中未提及,但是實(shí)際存在的功能」呢?

答案是肯定的。

本文將向你介紹3個(gè)文檔中未提及的隱藏彩蛋功能。

ref cleanup

在當(dāng)前React中,Ref存在兩種數(shù)據(jù)結(jié)構(gòu):

  1. <T>(instance: T) => void
  2. {current: T}

對(duì)于大部分需求,我們會(huì)使用第二種數(shù)據(jù)結(jié)構(gòu)。同時(shí),他也是useRef、createRef返回的數(shù)據(jù)結(jié)構(gòu)。

第一種數(shù)據(jù)結(jié)構(gòu)主要用于DOM監(jiān)控,比如在下面的例子中,div的尺寸會(huì)反映到height狀態(tài)中:

function MeasureExample() {
  const [height, setHeight] = useState(0);

  const measuredRef = useCallback(node => {
    if (node !== null) {
      setHeight(node.getBoundingClientRect().height);
    }
  }, []);

  return (
    <div ref={measuredRef}>Hello 卡頌</div>
  );
}

但在上面的例子中,DOM的尺寸變化無(wú)法實(shí)時(shí)反映到height狀態(tài)。為了反映實(shí)時(shí)變化,需要使用監(jiān)控DOM的原生API,比如:

  • ResizeObserver[1],監(jiān)控DOM尺寸變化。
  • IntersectionObserver[2],監(jiān)控DOM可視區(qū)域變化。
  • MutationObserver[3],監(jiān)控DOM樹(shù)變化。

這些API通常是事件驅(qū)動(dòng),這就涉及到「當(dāng)不需要監(jiān)控后,解綁事件」。

既然事件綁定是在ref回調(diào)中進(jìn)行的,很自然的,解綁事件也應(yīng)該在ref回調(diào)中進(jìn)行。比如,用ResizeObserver改造上述例子:

function MeasureExample() {
  const [entry, setEntry] = useState();
  
  const measuredRef = useCallback((node) => {
    const observer = new ResizeObserver(([entry]) => {
      setEntry(entry)
    })

    observer.observe(node)
    // 解綁事件
    return () => {
      observer.disconnect()
    }
  }, [])

  return (
    <div ref={measuredRef}>Hello 卡頌</div>
  );
}

在這個(gè)場(chǎng)景中,我們希望函數(shù)類型的ref可以返回一個(gè)新函數(shù),用于解綁事件(類似useEffect回調(diào)的返回值)。

實(shí)際上,在19年的#issues 15176[4]中就有人提出這個(gè)問(wèn)題。在去年底的#pull 25686[5]中相關(guān)改動(dòng)已經(jīng)合并到React main分支。

當(dāng)前React文檔中Ref的部分還未提及這個(gè)功能改動(dòng)。可能在未來(lái)的某個(gè)小版本中,會(huì)上線這個(gè)功能。

Module Component

你覺(jué)得下面的函數(shù)組件能渲染出「hello」么:

function Child() {
  return {
    render() {
      return "hello";
    }
  };
}

答案是 —— 可以,見(jiàn)Module Component在線示例[6]。

其實(shí)這是一種上古時(shí)期就存在的組件形式,叫做Module Component(即函數(shù)組件返回帶有render屬性的對(duì)象)。

當(dāng)遇到Module Component,React會(huì)將對(duì)應(yīng)函數(shù)組件(上例中的Child組件)轉(zhuǎn)換為Class Component,后續(xù)更新流程與Class Component無(wú)異。

Module Component預(yù)計(jì)會(huì)在未來(lái)的某個(gè)版本被移除(見(jiàn)#pull 15145[7]),所以文檔中并未提及。

要說(shuō)有啥實(shí)際作用,沒(méi)準(zhǔn)可以給你同事帶來(lái)點(diǎn)小小困惑......

開(kāi)啟全局并發(fā)更新

在v18中,只有使用并發(fā)特性(比如useTransiton)觸發(fā)的更新才是并發(fā)更新,其他情況觸發(fā)的更新都是同步更新。

如何才能不使用并發(fā)特性,又能全局開(kāi)啟并發(fā)更新呢?答案是在項(xiàng)目中加入下面這行咒語(yǔ):

React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentBatchConfig.transition = {
  帥哥: '卡頌'
};

比如,對(duì)于如下例子,渲染一個(gè)耗時(shí)的列表(每個(gè)Item組件render會(huì)耗時(shí)5ms):

function App() {
  return (
    <ul className="App">
      {Array.from({ length: 100 }).map((_, i) => (
        <Item key={i} num={i}>
          {i}
        </Item>
      ))}
    </ul>
  );
}

function Item({ children }) {
  const cur = performance.now();
  while (performance.now() - cur < 5) {}
  return <li>{children}</li>;
}

并發(fā)示例地址[8]。

不加上咒語(yǔ)時(shí)的渲染火炬圖如下,整個(gè)更新流程在一個(gè)宏任務(wù)中,耗時(shí)513ms:

圖片

加上咒語(yǔ)時(shí)的渲染火炬圖如下,整個(gè)更新流程被時(shí)間切片,每個(gè)切片5ms左右:

圖片

咒語(yǔ)為什么會(huì)起作用呢?

在React、ReactDOM中都存在變量__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,這個(gè)變量的作用是 —— 在不同包之間共享數(shù)據(jù)。

比如,所有Hook都是從React包中導(dǎo)出的,但Hook的具體實(shí)現(xiàn)在ReactDOM包中。為了在他們之間共享Hook,就需要一個(gè)媒介,這就是__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED。

圖片

類似的,「更新」相關(guān)數(shù)據(jù)也需要在React與ReactDOM間共享,其中就包括 —— 更新是否是并發(fā)更新。

當(dāng)我們賦值React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentBatchConfig.transition后,React會(huì)認(rèn)為當(dāng)前更新是并發(fā)更新。

通過(guò)這種方式,就能全局開(kāi)啟并發(fā)更新。

當(dāng)然,我并不建議你隨意更改__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED下的數(shù)據(jù),畢竟這個(gè)變量的名字還是挺唬人的。

總結(jié)

以上便是3個(gè)React中的隱藏彩蛋功能。其實(shí)除了他們之外,React中還有很多沒(méi)有暴露出來(lái)的API,比如類似Vue中Keep-Alive的Offscreen Component。

當(dāng)前要想體驗(yàn)Offscreen Component只能通過(guò)Suspense間接體驗(yàn)(Suspense能夠在pending與掛載組件間切換就是利用Offscreen Component)。

還有什么你知道的React隱藏功能?

參考資料

[1]ResizeObserver:https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver。

[2]IntersectionObserver:https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver。

[3]MutationObserver:https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver。

[4]#issues 15176:https://github.com/facebook/react/issues/15176。

[5]#pull 25686:https://github.com/facebook/react/pull/25686。

[6]Module Component在線示例:https://codesandbox.io/s/boring-proskuriakova-u4pzyl?file=/src/App.js。

[7]#pull 15145:https://github.com/facebook/react/pull/15145。

[8]并發(fā)示例地址:https://codesandbox.io/s/zen-ben-nldijx?file=/src/index.js。

責(zé)任編輯:姜華 來(lái)源: 魔術(shù)師卡頌
相關(guān)推薦

2018-02-28 11:42:59

戴爾

2011-06-13 09:59:21

2016-11-21 11:43:11

Python

2016-12-02 10:05:49

Python彩蛋

2018-04-26 13:33:20

Python語(yǔ)法Bug

2021-10-11 09:41:20

React位運(yùn)算技巧前端

2022-04-14 11:50:39

函數(shù)組件hook

2024-01-26 08:06:43

2020-11-01 20:30:53

Windows 10Windows 7Windows

2020-10-12 09:50:10

iOS 14蘋(píng)果功能

2022-03-31 17:54:29

ReactHooks前端

2015-09-09 18:06:53

戴爾云計(jì)算

2021-05-21 09:34:40

React React 17前端

2020-11-09 14:37:03

微信彩蛋翻譯

2013-11-05 10:03:22

Eclipse功能

2022-03-11 10:23:02

React性能優(yōu)化

2021-06-08 06:13:16

React開(kāi)發(fā)開(kāi)發(fā)技術(shù)

2013-01-25 14:35:18

Windows 7

2021-03-28 08:15:20

Windows 操作系統(tǒng)微軟

2023-10-27 08:59:00

網(wǎng)絡(luò)wiresharkIO
點(diǎn)贊
收藏

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

av资源新版天堂在线| 欧洲av在线播放| 成人情趣视频网站| 欧美性猛交一区二区三区精品| 亚洲不卡一卡2卡三卡4卡5卡精品| 男人日女人网站| 成人嘿咻视频免费看| 91麻豆精品久久久久蜜臀| 香港三级日本三级a视频| 亚洲欧美日韩综合在线| 麻豆精品在线播放| 久久久久国色av免费观看性色| 韩国无码一区二区三区精品| 91大神在线观看线路一区| 亚洲欧美日韩国产中文在线| 国产一区二区三区四区五区在线| 免费av中文字幕| 欧美在线91| 国产亚洲日本欧美韩国| 欧美一级小视频| 色在线视频观看| 一区二区在线观看不卡| 久久亚洲高清| 精品人妻av一区二区三区| 老司机亚洲精品| 久久久久久亚洲| 久久精品一区二区三区四区五区| 日本亚洲不卡| 日韩写真欧美这视频| 国内自拍视频网| 最近在线中文字幕| 亚洲精品免费视频| 亚洲欧美丝袜| 国产日本在线视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 中文字幕亚洲欧美一区二区三区| 丰满少妇xbxb毛片日本| 亚洲青青久久| 欧美日韩美女一区二区| 欧美日韩亚洲一| 黄网站在线观| 亚洲免费在线电影| 综合视频免费看| av女优在线| 久久午夜羞羞影院免费观看| 国产成人看片| 性欧美8khd高清极品| 精品亚洲国产成人av制服丝袜| 国产a∨精品一区二区三区不卡| 中文字幕一区二区三区手机版| 中文乱码免费一区二区三区下载| 日韩一区二区三区在线播放| 天天干天天舔天天操| 欧美精美视频| 亚洲天堂av图片| 久久只有这里有精品| 外国成人在线视频| 日韩精品电影网| 极品粉嫩小仙女高潮喷水久久| 懂色av一区二区| 亚洲国产成人精品女人久久久| 男人的天堂免费| 丁香综合av| 国产丝袜一区视频在线观看| 欧美精品黑人猛交高潮| 亚洲国产最新| 中文字幕久久亚洲| 黄色国产在线播放| 亚洲澳门在线| 九九九久久久久久| 日本一二三区不卡| 国产乱码精品| 国产精品美女免费视频| 国产99久久久久久免费看| 欧美bbbbb| 91精品视频在线免费观看| a级片免费视频| 成人精品视频一区二区三区| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 成人午夜电影在线观看| 国产欧美久久久精品影院| 亚洲精品国产精品国自产| а√天堂8资源在线官网| 亚洲蜜桃精久久久久久久| 国产美女主播在线| 日本久久免费| 69堂国产成人免费视频| 手机在线观看日韩av| 大桥未久女教师av一区二区| 亚洲美女av电影| 国产极品美女在线| 黄色成人91| 日本精品免费观看| 国产精品久久久久久久成人午夜| 国产a级毛片一区| 欧美日韩精品免费观看| yes4444视频在线观看| 亚洲私人影院在线观看| 九色自拍视频在线观看| 成人免费视频观看| 欧美videossexotv100| 欧美色图亚洲激情| 一区二区蜜桃| 国产成人av网址| 国产精品无码在线播放| 99riav一区二区三区| 在线电影看在线一区二区三区| 啦啦啦中文在线观看日本| 在线观看av一区| 性一交一黄一片| 黄色不卡一区| 久久久久久久久久久亚洲| 成人小视频在线播放| 国产成人亚洲精品青草天美| 日韩黄色影视| 爱啪视频在线观看视频免费| 欧美日韩精品福利| 国产精品无码午夜福利| 欧美日韩蜜桃| 成人久久一区二区| 国产三区四区在线观看| 亚洲国产精品自拍| 污免费在线观看| 日韩精品免费一区二区三区| 国外成人在线播放| 国产模特av私拍大尺度| 国产欧美日韩视频一区二区| 免费观看国产精品视频| 日韩高清在线观看一区二区| 色yeye香蕉凹凸一区二区av| 日本一区二区免费电影| 成人国产精品免费| 人妻av无码专区| 国产情侣一区在线| 日韩一区二区在线视频| 久久永久免费视频| 久久一区二区视频| 一女被多男玩喷潮视频| 99久久婷婷国产综合精品青牛牛 | 成人免费91在线看| 巨大荫蒂视频欧美另类大| 欧美自拍偷拍一区| 极品人妻videosss人妻| 蜜桃av综合| 欧美另类网站| 亚洲1234区| 亚洲全黄一级网站| 亚洲天堂五月天| 久久久国产一区二区三区四区小说| 日本午夜激情视频| 青青一区二区| 人九九综合九九宗合| 天天射天天操天天干| 亚洲午夜精品久久久久久久久| 亚洲精品无码久久久久久久| 91tv官网精品成人亚洲| 亚洲一区久久久| 亚洲丝袜一区| 亚洲第一免费网站| 欧美特黄aaaaaa| 2020国产精品自拍| 日本成人在线免费视频| 国产精品三级| 国产精品电影网| 日韩免费网站| 欧美一级片在线| 国产一级片视频| 99精品久久只有精品| www.浪潮av.com| 狠狠做深爱婷婷综合一区| 国产精品小说在线| 在线观看的网站你懂的| 精品999在线播放| 国产高清中文字幕| 中文字幕av一区二区三区免费看| a在线观看免费视频| 亚洲深深色噜噜狠狠爱网站| 国产不卡一区二区在线观看| 成年女人在线看片| 亚洲日本成人网| 97免费观看视频| 亚洲二区在线视频| 伊人网在线视频观看| 免费成人在线视频观看| 成人午夜视频免费观看| 久久porn| 国产精品美女久久久久久免费| 超碰免费在线播放| 亚洲精美色品网站| 一二三四区在线| 亚洲一线二线三线视频| 欧美激情aaa| 国产精品99久久久| 男人操女人免费| 91成人网在线观看| 美女主播视频一区| 韩国三级成人在线| 日韩美女福利视频| 手机电影在线观看| 亚洲午夜久久久影院| 国产欧美久久久| 欧美性猛交xxxx免费看| 天天色天天综合| 久久综合九色综合97婷婷| av在线网址导航| 亚洲精选一区| 一本二本三本亚洲码| 亚洲精品国产动漫| 亚洲最大av网| 激情久久99| 热re91久久精品国99热蜜臀| 久草资源在线| 亚洲三级 欧美三级| 亚洲精品久久久蜜桃动漫| 在线看国产一区| 欧美精品亚洲精品日韩精品| 亚洲欧洲日产国码二区| 在线观看日韩精品视频| 国产福利不卡视频| 色婷婷一区二区三区av免费看| 国产精品美女久久久| 国产欧美自拍视频| 成人影院在线| 欧美二区三区| 久久精品色播| 国产精品传媒毛片三区| 91九色成人| 国产欧美日韩免费| 高清电影一区| 青草成人免费视频| 2018av在线| 久久久亚洲天堂| 在线观看中文| 久久91精品国产| 国产精品扒开做爽爽爽的视频| 一个人www欧美| 免费av在线电影| 亚洲韩国青草视频| 日韩在线观看视频网站| 日韩免费电影一区| 国产免费高清视频| 欧美一区二区高清| 国产欧美第一页| 日韩三级中文字幕| 精品久久久中文字幕人妻| 欧美电影一区二区三区| 一级特黄aaaaaa大片| 欧美羞羞免费网站| 中文字幕在线播放av| 欧美三区在线视频| 中文字幕+乱码+中文| 欧美色手机在线观看| 糖心vlog精品一区二区| 在线观看欧美精品| 中文字幕久久久久| 欧美精品一卡两卡| 99热这里只有精品在线观看| 91精品国产综合久久婷婷香蕉 | 日本一区二区免费看| 欧美日韩激情| 伊人久久大香线蕉精品| 欧美韩日高清| 欧美与动交zoz0z| 欧美日韩ab| 国内精品视频一区二区三区| 亚洲精品男同| 精品久久久久久久无码| 欧美aⅴ一区二区三区视频| 亚洲天堂国产视频| 成人一区二区在线观看| 亚洲久久久久久| 久久九九全国免费| 日本不卡一二区| 亚洲成a天堂v人片| 久久久精品毛片| 欧美高清你懂得| 亚洲精品网站在线| 日韩精品在线免费观看视频| 成人在线播放视频| 久色乳综合思思在线视频| 国产又色又爽又黄刺激在线视频| 91大神福利视频在线| 99re66热这里只有精品4| 成人免费xxxxx在线观看| av自拍一区| 日韩欧美视频一区二区| 你懂的一区二区| 欧美日韩一道本| 蜜桃av一区二区| 国产av一区二区三区传媒| 久久影院电视剧免费观看| 国产又粗又长又黄的视频| 亚洲国产裸拍裸体视频在线观看乱了| 国产亚洲欧美在线精品| 91精品国产丝袜白色高跟鞋| 手机在线不卡av| 久久久精品中文字幕| 超碰激情在线| 亚洲free嫩bbb| 美女久久99| xxxxxx在线观看| 日韩影院免费视频| 国产香蕉精品视频| 国产精品毛片久久久久久| 日韩污视频在线观看| 欧美伦理视频网站| 欧美拍拍视频| 欧美国产精品va在线观看| 日韩精品第一| 九九九九精品九九九九| 婷婷久久国产对白刺激五月99| 国产午夜福利100集发布| 激情综合亚洲精品| 无码人妻aⅴ一区二区三区69岛| 一区二区三区日本| 91麻豆成人精品国产| 亚洲欧美激情精品一区二区| 日韩激情av| 91久久精品在线| 欧美日韩黑人| 国产成人a亚洲精v品无码| 国产suv精品一区二区6| 成年人午夜剧场| 欧美午夜一区二区| 欧美精品a∨在线观看不卡 | 精品一区二区三区久久久| 亚洲熟妇无码av| 午夜日韩在线电影| 肥臀熟女一区二区三区| 久久精品夜夜夜夜夜久久| 福利一区二区三区视频在线观看| 国产精品一区二区三区不卡 | 亚洲日本va| 51xx午夜影福利| 国产一区二区在线电影| 你懂得在线观看| 欧美日韩亚洲国产综合| 国产毛片av在线| 国产97免费视| 国产精品一线天粉嫩av| 国产二区视频在线播放| 成人黄色av电影| 男女视频免费看| 亚洲精品国产综合久久| 97人人在线视频| 精品国产乱码久久久久久108| 在线成人h网| 中文在线观看免费视频| 亚洲一区二区成人在线观看| 亚洲av无码片一区二区三区| 久久中文字幕在线| 欧美另类中文字幕| www.亚洲成人网| 成人av在线网| 国产成人自拍视频在线| 精品视频一区在线视频| 美女18一级毛片一品久道久久综合| 久久久久欧美| 日韩一区欧美二区| 国产又色又爽又高潮免费| 欧美性大战久久久| 老司机在线视频二区| 亚洲精品免费网站| 亚洲人妖在线| 人妻少妇一区二区| 欧美三电影在线| 国产日产一区二区| 粉嫩av免费一区二区三区| 亚洲激情网站| 老熟妇一区二区| 制服丝袜在线91| 白白色在线观看| 欧美日韩系列| 精品影视av免费| 国产无遮挡又黄又爽在线观看| 亚洲成人网av| 本网站久久精品| 亚洲精品少妇一区二区| 99国内精品久久| 在线观看毛片网站| 欧美高清电影在线看| 丝袜美腿综合| 欧美一级视频在线| 亚洲国产精品精华液网站| 欧美色综合一区二区三区| 国产精品最新在线观看| 欧美日本不卡高清| 美女洗澡无遮挡| 日韩午夜精品视频| 日韩成人动漫| 永久免费网站视频在线观看| 91在线播放网址| 国产精品久久免费| 欧美亚洲另类在线| 911精品美国片911久久久| 噜噜噜在线视频| 91精品国产综合久久久久久漫画 | 天天做天天爱天天综合网2021| 一级黄色免费视频| 精品视频在线免费看|