React 17

隨著 React 17 的發(fā)布,我們會(huì)驚訝地發(fā)現(xiàn),v17 版本的最大特性是無新特性征讲。因?yàn)樗鼪]有添加任何面向開發(fā)人員的新功能,而是專注在了如何簡(jiǎn)化 React 本身的升級(jí)录择。

React 17 可以說是發(fā)揮了「跳板」的作用拔莱,它將使由一個(gè)版本的 React 管理的樹嵌入到由另一個(gè)版本的 React 管理的樹中更加安全碗降。也就是說在不遠(yuǎn)的將來,使用 React 17 及以上的項(xiàng)目在升級(jí)的時(shí)候可以考慮部分模塊仍然使用 V17 的版本塘秦。

那讓我們來一起看看 V17 版本都做了些什么讼渊?

漸進(jìn)式升級(jí)

React 17 支持逐步的 React 升級(jí)。

在 React 17 之前尊剔,React 升級(jí)必須整個(gè)應(yīng)用升級(jí)到指定版本爪幻,不能一個(gè)應(yīng)用中存在兩個(gè) React 版本。但是须误,如果代碼比較陳舊挨稿,并且沒有得到很好的維護(hù),則升級(jí)的挑戰(zhàn)會(huì)更大京痢。

可能有人會(huì)問奶甘,為什么我們不可以在頁面上使用兩個(gè) React 版本?

因?yàn)樵陧撁嫔鲜褂脙蓚€(gè)版本的 React 祭椰,可能會(huì)導(dǎo)致事件問題臭家。在下面的 事件變更 中會(huì)詳細(xì)講到疲陕。

當(dāng) React 17 發(fā)布之后,在下一個(gè)版本問世時(shí)钉赁,帶來了更多的選擇蹄殃。我們可以不必像以前一樣,可以選擇逐個(gè)升級(jí)應(yīng)用程序你踩。例如诅岩,您可以決定將大部分應(yīng)用程序遷移到 React 18,但在 React 17 上仍然保留一些不常變動(dòng)的頁面或子路由带膜。

但是按厘,這不意味著您必須逐步升級(jí)。

對(duì)于大多數(shù)應(yīng)用程序钱慢,全部升級(jí)仍然是最好的解決方案逮京。但是,對(duì)于沒有積極維護(hù)的大型應(yīng)用程序束莫,可以考慮使用逐步升級(jí)懒棉,并且新版本的 React 也可以使這些應(yīng)用不落伍。

React 若想逐步升級(jí)览绿,就應(yīng)該啟用漸進(jìn)式的更新策严,所以需要對(duì) React 事件系統(tǒng)進(jìn)行一些更改。

事件變更

React 17 將事件處理附加到 rootNode 上饿敲,而不是 document 上妻导。

事件代理

由上圖可以發(fā)現(xiàn),在 React 16 及以前怀各,React 對(duì)事件執(zhí)行 document.addEventListener()倔韭,而在 React 17 以后,React 對(duì)根 DOM 執(zhí)行 rootNode.addEventListener()瓢对。

也就是說寿酌,在 React 17 中,React 將不再在 document 級(jí)別 attach 事件處理器硕蛹,而是 attach 到 React 渲染樹的根 DOM 容器中:

const rootNode = document.getElementById('root'); 
ReactDOM.render(<App />, rootNode);

這么做的原因是什么呢醇疼?

在 React 17 以前,所有的事件會(huì)被附加到 document 上法焰,并為它建一個(gè)處理器秧荆,當(dāng) DOM 事件觸發(fā)時(shí),會(huì)向上冒泡埃仪,一直到 document 級(jí)別乙濒,也就是附加事件處理器的地方,事件會(huì)得到響應(yīng)贵试。

如果頁面上有多個(gè) React 版本琉兜,事件都會(huì)被附加在 document 上凯正。這時(shí)嵌套的 React 樹調(diào)用 e.stopPropagation() 停止了事件冒泡,外部的樹仍會(huì)接收到該事件豌蟋,這就使嵌套不同版本的 React 難以實(shí)現(xiàn)廊散。

React DOM 變更
  • 禁止在 onScroll 事件時(shí)冒泡。

  • React onFocus 和 onBlur 事件已轉(zhuǎn)換為瀏覽器下的原生 focusin 和 focusout 事件梧疲,這與 React 的現(xiàn)有實(shí)現(xiàn)更為接近允睹,有時(shí)還能提供額外的信息。

  • 將所有 Capture 事件都使用瀏覽器的捕獲階段實(shí)現(xiàn)幌氮。

  • 異步運(yùn)行 useEffect 清理函數(shù)缭受。

useEffect(() => {
  return () => {
    // 清理函數(shù)
 };
});

在 React 16 中,effect 的清理函數(shù)會(huì)同步運(yùn)行该互,在大型應(yīng)用中大量的數(shù)據(jù)變更會(huì)減慢屏幕變換的速度米者,而且,大多數(shù) effect 都不需要延緩屏幕的更新宇智。

在 React 17 中蔓搞, effect 清理函數(shù)是異步運(yùn)行的。并且随橘,React 17 會(huì)根據(jù) effect 在樹中的位置喂分,以相同的順序執(zhí)行清理函數(shù)。以前机蔗,這個(gè)順序會(huì)有所不同蒲祈。

例如,如果要卸載組件萝嘁,清理函數(shù)將在屏幕更新后運(yùn)行梆掸。

如果希望同步執(zhí)行,這時(shí)你可以使用 useLayoutEffect酿愧。

  • 移除事件池沥潭。
function onChange(e) {
  setData(data => ({  
    ...data,
    text: e.target.value   
  })); 
}

在 React 16 及更早版本中,React 為了提高性能復(fù)用了不同事件之間的事件對(duì)象嬉挡,并將所有事件字段高為 null。在上面代碼中若想正確使用汇恤,須得調(diào)用 e.persist()庞钢。

而在 React 17 中,上面代碼可以好好地運(yùn)行因谎。

  • 如果 forwardRef 或 memo 組件的返回值為 undefined基括,則拋出異常。
const Button = forwardRef(() => {
  <button />;
});
const Button = memo(() => {
  <button />;
});

上面代碼中财岔,React 17 會(huì)把它標(biāo)記為 error 而非忽略它风皿。

在 React 16 及更早版本中河爹,React 僅會(huì)對(duì)類和函數(shù)組件返回 undefined 時(shí)會(huì)當(dāng)成錯(cuò)誤,但不檢查 forwardRef 和 memo 組件的返回值桐款。

而在 React 17 中咸这,對(duì) forwardRef 和 memo 組件的處理與普通函數(shù)和類組件一致,即在它們返回 undefined 會(huì)被視為錯(cuò)誤魔眨。

  • 移除 React Native Web 不需要的內(nèi)部組件媳维。

  • 棄用未記錄且具有誤導(dǎo)性的 ReactTestUtils.SimulateNative API。

  • 修復(fù)當(dāng) dangerouslySetInnerHTML 為 undefined 時(shí)遏暴,誤報(bào)警告的問題侄刽。

React DOM Server
  • 使用服務(wù)端渲染的 useCallback 與 useMemo 一致。

  • 修復(fù)函數(shù)組件拋出異常時(shí)狀態(tài)泄露的問題朋凉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末州丹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子杂彭,更是在濱河造成了極大的恐慌当叭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盖灸,死亡現(xiàn)場(chǎng)離奇詭異蚁鳖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赁炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門醉箕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徙垫,你說我怎么就攤上這事讥裤。” “怎么了姻报?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵己英,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吴旋,道長(zhǎng)损肛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任荣瑟,我火速辦了婚禮治拿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笆焰。我一直安慰自己劫谅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捏检,像睡著了一般荞驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贯城,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天熊楼,我揣著相機(jī)與錄音,去河邊找鬼冤狡。 笑死孙蒙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悲雳。 我是一名探鬼主播挎峦,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼合瓢!你這毒婦竟也來了坦胶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤晴楔,失蹤者是張志新(化名)和其女友劉穎顿苇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體税弃,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纪岁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了则果。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔翰。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖西壮,靈堂內(nèi)的尸體忽然破棺而出遗增,到底是詐尸還是另有隱情,我是刑警寧澤款青,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布做修,位于F島的核電站,受9級(jí)特大地震影響抡草,放射性物質(zhì)發(fā)生泄漏饰及。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一渠牲、第九天 我趴在偏房一處隱蔽的房頂上張望旋炒。 院中可真熱鬧,春花似錦签杈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铣除。三九已至,卻和暖如春鹦付,著一層夾襖步出監(jiān)牢的瞬間尚粘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工敲长, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郎嫁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓祈噪,卻偏偏與公主長(zhǎng)得像泽铛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辑鲤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文翻譯自React官網(wǎng): React v17.0 Release Candidate: No New Featu...
    魂斗驢閱讀 4,478評(píng)論 0 0
  • 前言 React17自去年十月發(fā)布以來盔腔,出現(xiàn)了幾個(gè)比較重要的變化。首先月褥,17作為一個(gè)過渡版本弛随,其明確了在react...
    維李設(shè)論閱讀 523評(píng)論 0 1
  • 簡(jiǎn)介 設(shè)計(jì)理念單向數(shù)據(jù)流、虛擬 DOM宁赤、組件化 組件化編程的思想React 以組件的方式去重新思考用戶界面的構(gòu)成舀透,...
    歡欣的膜笛閱讀 1,250評(píng)論 0 2
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒决左。表情可以傳達(dá)很多信息愕够。高興了當(dāng)然就笑了,難過就哭了哆窿。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,138評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者链烈,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)挚躯,也就放棄了無數(shù)的可能强衡。 ...
    yichen大刀閱讀 6,054評(píng)論 0 4