精品欧美一区二区三区在线观看 _久久久久国色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色偷偷网| jjzz黄色片| 99re久久| 亚洲第一福利一区| 亚洲一区二区精品在线| 天天操天天爱天天干| 麻豆精品一区二区三区| 午夜精品福利视频| 国产麻豆a毛片| 天天久久夜夜| 91麻豆精品国产91久久久久久久久| 国产精品国产亚洲精品看不卡| 97超碰人人在线| 成+人+亚洲+综合天堂| 国产精品吴梦梦| 毛片视频网站在线观看| 欧美激情自拍| x99av成人免费| 30一40一50老女人毛片| 高潮久久久久久久久久久久久久| 欧美午夜精品理论片a级按摩| 青青青免费在线| 成人看av片| 中文字幕一区二区三区在线观看| 麻豆传媒一区| 黄色小视频免费观看| 国产精品一二三区| 国产精自产拍久久久久久| 4438国产精品一区二区| 一区在线视频观看| 欧美疯狂做受xxxx高潮| 国产精品成人免费观看| 亚洲精品va| 日韩视频免费观看| 国产午夜精品久久久久久久久| 蜜桃一区二区三区| 亚洲欧洲美洲在线综合| 国产偷人妻精品一区| 国产一区二区三区不卡av| 欧美影视一区二区三区| 欧美牲交a欧美牲交aⅴ免费下载| 岛国av免费在线观看| 亚洲一区二区三区在线看| av一区二区三区免费观看| а√天堂资源地址在线下载| 亚洲欧美综合色| 99re8这里只有精品| 精品自拍一区| 亚洲美女一区二区三区| 国产激情片在线观看| 超碰在线无需免费| 亚洲精品写真福利| 欧美国产视频一区| 国产后进白嫩翘臀在线观看视频 | 欧美婷婷六月丁香综合色| 黄页网站大全在线观看| 蜜桃视频在线观看播放| 欧美小视频在线| 国产精品wwwww| 日本精品在线中文字幕| 欧美日韩精品一区二区天天拍小说| 日本久久精品一区二区| av成人在线看| 欧美理论电影在线| 久久久久久国产精品日本| 成人动态视频| 亚洲欧美日韩高清| 第一次破处视频| 91精品国产成人观看| 久久久久国产精品免费| 一级片在线观看免费| 蜜桃一区二区三区四区| 亚洲aa在线观看| 亚洲欧美激情国产综合久久久| 99国产精品99久久久久久| 免费亚洲一区二区| 91精品专区| 亚洲一区二区三区自拍| av天堂永久资源网| 亚洲国产91视频| 精品福利在线导航| 成人无码www在线看免费| 日韩av片子| 久久99久国产精品黄毛片入口| 国产精品第二十页| 老司机午夜免费精品视频| 91老司机在线| 青青久在线视频| 中文字幕视频一区二区三区久| www.成年人视频| 欧美va视频| 精品久久久久久无| www成人啪啪18软件| 日韩午夜精品| 91麻豆桃色免费看| 欧美在线观看在线观看| 一区二区三区日韩精品| 一本久道中文无码字幕av| 四虎国产精品永久在线国在线| 精品成人一区二区三区四区| 2017亚洲天堂| 久久高清国产| 国产乱码精品一区二区三区中文 | 理论片一区二区在线| 中文字幕欧美日韩精品| 国产福利久久久| 久久精品国产亚洲a| 欧美国产综合视频| 黄色美女视频在线观看| 8x福利精品第一导航| 亚洲一区视频在线播放| 最新亚洲激情| 91传媒免费看| 黄色成人在线观看| 欧美专区在线观看一区| 一起草在线视频| 午夜天堂精品久久久久| 91精品国产综合久久男男| 国产视频第一区| 精品高清美女精品国产区| 国产裸体视频网站| 亚洲va在线| 成人av电影天堂| 日本在线免费| 欧美日韩久久不卡| 香蕉久久久久久久| 日本美女视频一区二区| 日韩精品一区二区三区外面| 周于希免费高清在线观看| 精品国产sm最大网站| 久久久香蕉视频| 国产麻豆日韩欧美久久| 午夜在线视频免费观看| 深夜日韩欧美| 欧美不卡视频一区发布| 国产精品伦理一区| 亚洲欧洲三级电影| 91香蕉国产线在线观看| 我不卡手机影院| 91亚洲精品一区| 综合图区亚洲| 亚洲国产精品字幕| 好吊操这里只有精品| 岛国精品一区二区| 国产freexxxx性播放麻豆| 超碰成人免费| 性欧美在线看片a免费观看| 天天色综合av| 色综合网站在线| 亚洲精品国产一区黑色丝袜| 欧美aⅴ一区二区三区视频| 日韩中文字幕av在线| 97人人做人人爽香蕉精品| 日韩在线观看免费网站| 国产精品久久久久久久久久久久久久久久久久 | 在线精品国产成人综合| 一区二区三区精| 一区二区三区91| 久久久老熟女一区二区三区91| 国产精品普通话对白| 日本高清久久一区二区三区| 免费视频成人| 欧美猛交免费看| 欧美日韩在线中文字幕| 欧美性猛交xxxxxxxx| 国产少妇在线观看| 91丨porny丨中文| 少妇黄色一级片| 中文精品电影| 九色91在线视频| 全球最大av网站久久| 久久久精品国产亚洲| 黄色一级a毛片| 欧美亚洲综合在线| 在线免费观看亚洲视频| 99视频精品在线| www.com黄色片| 合欧美一区二区三区| 欧美伦理一区二区| 91精品国产一区二区在线观看 | 黄色一级视频在线播放| 国产精品一国产精品| 亚洲精品欧美日韩| 波多视频一区| 欧美xxxx18性欧美| 久青草国产在线| 欧美一级二级三级蜜桃| 欧美在线观看不卡| 亚洲免费av在线| 亚洲一级黄色录像| 成人免费高清在线观看| 天天干天天草天天| 亚洲美女色禁图| 欧美爱爱视频网站| 要久久爱电视剧全集完整观看| 91中文精品字幕在线视频| 日本电影欧美片| 久久久久久久电影一区| 中国日本在线视频中文字幕| 日韩成人在线视频网站| 国产ts变态重口人妖hd| 欧美系列一区二区| 六月丁香在线视频| 亚洲精品你懂的| 手机免费看av| 9色porny自拍视频一区二区| 91性高潮久久久久久久| 免费亚洲电影在线| 久久无码高潮喷水| 亚洲高清免费| 今天免费高清在线观看国语| 成人在线丰满少妇av| 国产一区二区中文字幕免费看| 成人黄色91| 国产三级精品网站| 欧美影视资讯| 欧美诱惑福利视频| 97超碰免费在线| 久久久久久中文| 色婷婷av在线| 久久成人免费视频| 美女隐私在线观看| 国产一区二区三区18| 日本护士...精品国| 亚洲精品乱码久久久久久按摩观| www.97超碰| 欧美一级日韩一级| 一区二区三区黄色片| 欧美电影一区二区| 亚洲资源在线播放| 欧美日韩一区二区三区视频| 进去里视频在线观看| 在线观看av不卡| 糖心vlog精品一区二区| 在线观看国产精品网站| 中文无码av一区二区三区| 欧美又粗又大又爽| 在线免费a视频| 欧美群妇大交群中文字幕| 亚洲一区二区三区高清视频| 欧美色爱综合网| 一级片免费观看视频| 91麻豆精品国产91久久久使用方法 | 久久亚洲AV无码专区成人国产| 久久精品亚洲一区二区三区浴池| 亚洲天堂久久新| 欧美激情中文不卡| 久久久久久久久久97| 亚洲日本在线看| 免费毛片在线播放免费| 亚洲mv大片欧洲mv大片精品| www欧美在线| 欧美亚洲国产一卡| 国产精品爽爽久久久久久| 91精品国产高清一区二区三区蜜臀| 国产亲伦免费视频播放| 欧美xingq一区二区| 婷婷国产在线| 国产一区二区三区精品久久久| www视频在线观看免费| 久久精品国亚洲| aa视频在线观看| 国产精品av电影| 国产美女视频一区二区| 国产精品区一区二区三含羞草| 婷婷精品视频| 在线观看欧美亚洲| 合欧美一区二区三区| 黄色国产小视频| 国产精品夜夜爽| 亚洲第一香蕉网| 亚洲男人的天堂在线观看| 日韩精品国产一区二区| 欧美亚洲动漫精品| 精品人妻一区二区三区换脸明星| 亚洲精品久久久久久下一站| 无遮挡动作视频在线观看免费入口| 久操成人在线视频| 免费观看成人性生生活片| 亚洲最大激情中文字幕| 日韩在线麻豆| 成人短视频在线看| 噜噜噜躁狠狠躁狠狠精品视频| 五月天激情播播| 久久麻豆一区二区| 激情综合网五月天| 欧美羞羞免费网站| 日韩一级片免费观看| www亚洲欧美| 激情都市亚洲| 成人免费看片网站| 日韩电影免费网址| 美女日批免费视频| 国产曰批免费观看久久久| 国产美女精品久久| 亚洲国产日韩综合久久精品| 中文字幕精品一区二| 亚洲精品按摩视频| 成人福利在线观看视频| 国产精品视频26uuu| 欧美三级午夜理伦三级在线观看| 欧美aaa在线观看| 丝袜诱惑制服诱惑色一区在线观看| 91亚洲一线产区二线产区 | 久久久久久久久久久久久久久久久| 91黄色小视频| 亚洲欧美丝袜中文综合| 欧美激情视频在线观看| 性欧美video另类hd尤物| 欧美一区1区三区3区公司| 激情久久久久久| 四虎1515hh.com| 中文字幕在线观看不卡| 日韩在线播放中文字幕| 日韩精品免费视频| 欧美男男video| 91成人免费在线观看| 性欧美69xoxoxoxo| av免费一区二区| 国产精品色婷婷| 国产一区免费看| 国产亚洲精品久久久优势| 婷婷电影在线观看| 国内成+人亚洲| 最新亚洲激情| 水蜜桃av无码| 精品成人av一区| 日本一卡二卡四卡精品 | www.av88| 伊人男人综合视频网| av在线日韩| 亚洲欧洲日韩精品| 久久精品国产999大香线蕉| 一二三四在线观看视频| 欧美日韩一区视频| 色视频在线免费观看| 国产精品一区二区三区在线播放| 成久久久网站| 一区二区免费av| 亚洲天堂av一区| www.久久色| 久久久久久亚洲精品中文字幕| 超碰精品在线观看| 久久久久久久久久久视频| 久久综合色8888| 久久精品五月天| 色爱精品视频一区| 日本在线一区二区三区| 亚洲爆乳无码精品aaa片蜜桃| 岛国av在线一区| 青青草免费观看视频| 国产亚洲a∨片在线观看| 高清亚洲高清| 日本一二三区视频在线| 成人性视频免费网站| 日本少妇xxxx动漫| 亚洲无线码在线一区观看| 国产亚洲欧美日韩精品一区二区三区 | 久久精精品视频| 日韩vs国产vs欧美| 三级黄色在线观看| 精品国产91九色蝌蚪| 在线日韩影院| 中文字幕色一区二区| 粉嫩蜜臀av国产精品网站| 色一情一乱一伦| www.亚洲人.com| 欧美亚洲色图校园春色| 国产91色在线观看| 一区二区三区日韩欧美| 激情小视频在线| 91精品综合视频| 一本久道久久综合狠狠爱| 刘亦菲国产毛片bd| 亚洲成人久久网| 国产亚洲精彩久久| heyzo亚洲| 国产精品国产精品国产专区不片| 韩国av免费在线观看| 国产精品高清在线观看| 欧美网站在线| 久久久视频6r| 精品国产一区二区三区不卡| 超碰这里只有精品| 欧美成人精品免费| 亚洲国产成人私人影院tom| 亚洲欧美黄色片| 国产欧美婷婷中文| 国产日韩亚洲| 青青草免费av| 日韩中文字幕国产精品| 天堂网av成人| 国产a级片视频| 欧美日韩一级大片网址|