国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊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彩蛋

2021-10-11 09:41:20

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

2018-04-26 13:33:20

Python語(yǔ)法Bug

2022-04-14 11:50:39

函數(shù)組件hook

2020-11-01 20:30:53

Windows 10Windows 7Windows

2024-01-26 08:06:43

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ù)

2023-10-27 08:59:00

網(wǎng)絡(luò)wiresharkIO

2013-01-25 14:35:18

Windows 7

2021-03-28 08:15:20

Windows 操作系統(tǒng)微軟
點(diǎn)贊
收藏

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

日韩视频一区二区三区四区| 欧美成人综合网站| 亚洲一二三四在线观看| 91最新在线免费观看| 97最新国自产拍视频在线完整在线看| 91综合久久爱com| 国产精品少妇自拍| 亚洲免费av电影| www.xxx亚洲| 在线观看视频一区二区三区| 国产美女诱惑一区二区| 欧美日韩高清一区| 日韩av电影免费在线| 日韩在线短视频| 久久无码av三级| 欧美精品性视频| 国产免费播放一区二区| 最近免费中文字幕视频2019| 深夜福利视频一区| 国产一区二区在线观看视频| 欧美一级高清免费| 日本电影在线观看网站| 久久国产精品色婷婷| 国产精品久久久久久久美男| 欧美精品videossex少妇| 国产精品亲子伦对白| 欧美少妇在线观看| 欧美日韩免费| 国产成人av网| 欧洲亚洲精品| 亚洲国产一区二区三区四区| 久草中文在线| 亚洲一级在线观看| 天天色综合社区| 亚洲精品小说| 69影院欧美专区视频| www.久久.com| 午夜国产精品视频| 日韩一级大片在线| a中文在线播放| 中文字幕免费国产精品| 成人av电影在线| 欧美精品www在线观看| 最新精品国偷自产在线| 99r国产精品视频| 国产精品传媒在线| 69av一区二区三区| 中国在线观看免费国语版电影 | 一区二区三区久久精品| 嫩草成人www欧美| 97免费中文视频在线观看| 黄a在线观看| 天天综合色天天| 亚洲靠逼com| 人人在线97| 欧美日韩午夜激情| av2020不卡| 欧美va天堂在线| 欧美一级视频在线观看| av在线app| 日韩高清不卡av| 国产香蕉精品| 国产精品视频久久久| 日韩黄色在线观看| 日本一区二区免费看| 久久国产综合| 成人a在线视频| 亚洲黄色影片| 日本欧美黄色片| 国产精品免费观看视频| 午夜爽爽爽男女免费观看影院| 中文乱码免费一区二区| 色久视频在线播放| 日韩欧美高清dvd碟片| 欧美日韩经典丝袜| 国产精品大陆在线观看| 亚洲最大黄色| 亚洲欧美视频一区| 九七久久人人| 久久精品国产久精国产思思| 国产精品欧美激情在线播放| 成人av动漫在线| 一区二区三区免费在线看| 不卡视频一区二区| 国产精选一区二区三区| 中文字幕毛片| 久久久精品美女| 美女视频一区免费观看| www日韩tube| 一本色道久久综合亚洲精品婷婷| yourporn久久国产精品| 中文字幕在线视频网| 中日韩午夜理伦电影免费 | 国产精品国产三级国产有无不卡 | 福利片在线看| 国产精品系列在线| 在线观看三级视频| 国产精品久久一区| 97精品超碰一区二区三区| 欧美jizzhd欧美| 国产欧美精品一区二区三区介绍 | 国产欧美精品国产国产专区| 国产丝袜精品丝袜| 91精品中国老女人| 国产精品日韩成人| 国产黄色一区| 牛牛电影国产一区二区| 亚洲一区二区三区在线观看视频| 在线观看国产精品入口| 色拍拍在线精品视频8848| 国产精品外国| 91福利精品在线观看| 久久人人爽人人爽爽久久| 久久精品中文| 中文字幕一区日韩电影| 1024日韩| 亚洲字幕成人中文在线观看| 欧美成人一区二区三区电影| 国产69精品久久777的优势| 午夜视频在线看| 亚洲午夜日本在线观看| 国产日韩欧美电影| 欧美孕妇孕交xxⅹ孕妇交| 国产精品极品尤物在线观看 | 国产综合av| 看欧美日韩国产| 欧美午夜精品久久久久久超碰| 欧美国产偷国产精品三区| 特黄特色特刺激视频免费播放 | 国产美女高潮久久白浆| 亚洲免费成人av| 亚洲成人一品| 三年片观看免费观看大全视频下载| 97涩涩爰在线观看亚洲| 国产精品国产三级国产普通话99 | 中文字幕一区二区三区在线视频 | 99热国产在线中文| 欧美激情专区| 91精品欧美综合在线观看最新| 欧美午夜不卡| 免费日本一区二区三区视频| 国产在线一区二区三区播放| 调教+趴+乳夹+国产+精品| 小嫩嫩12欧美| 又黄又爽在线观看| 999热视频在线观看| 欧美一区二区三区四区五区| 日韩1区2区3区| 国产一区二区三区精品欧美日韩一区二区三区 | xxxxx国产| 久久久久这里只有精品| 国产欧美一区二区三区网站| 日韩区欧美区| 成视频年人免费看黄网站| 国产xxx69麻豆国语对白| 亚洲人成亚洲人成在线观看图片| 亚洲国产合集| 亚洲字幕成人中文在线观看 | 国产一区二区三区天码| 性色视频在线观看| 久热国产精品视频一区二区三区| 亚洲国产99精品国自产| 99精品久久免费看蜜臀剧情介绍| 最新国产一区二区| 91se在线观看| 日本高清不卡三区| 久久久国产精彩视频美女艺术照福利 | 日本在线人成| 美女黄色免费看| 国产91精品不卡视频| 欧美片网站yy| 91丝袜高跟美女视频| 日韩在线观看电影完整版高清免费悬疑悬疑 | 国产午夜在线视频| 亚洲一卡二卡三卡四卡无卡网站在线看 | 亚洲午夜久久久久久尤物| 午夜羞羞小视频在线观看| 1024av视频| 51国偷自产一区二区三区的来源| 精品久久五月天| 国产免费成人在线视频| 欧美精品国产| 国产精品麻豆| 幼a在线观看| 另类小说第一页| 精品免费一区二区三区蜜桃| 久久影院模特热| 欧美区视频在线观看| 久久精品免费在线观看| 99在线精品免费视频九九视| 日韩一区二区三区在线看| av免费观看一区二区| 91淫黄看大片| 麻豆传媒一区| 青草成人免费视频| 国产视频一区在线| 色综合天天天天做夜夜夜夜做| 91麻豆免费在线观看| 久久欧美肥婆一二区| 日韩精品导航|