自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

React 18的并發(fā)渲染:顛覆傳統(tǒng)的性能飛躍

開(kāi)發(fā)
React 18的并發(fā)渲染特性通過(guò)引入Fiber架構(gòu)和startTransition等方法,實(shí)現(xiàn)了更加靈活和高效的渲染控制。

React 18 引入的并發(fā)渲染(Concurrent Rendering)是一個(gè)革命性的特性,它改變了 React 應(yīng)用的渲染方式,使得渲染過(guò)程更加高效且可控。

并發(fā)渲染的核心原理在于將渲染任務(wù)拆分為多個(gè)可中斷和可恢復(fù)的小任務(wù),并根據(jù)優(yōu)先級(jí)進(jìn)行調(diào)度。下面我們將通過(guò)代碼示例詳細(xì)解析 React 18 并發(fā)渲染的原理。

1. Fiber 架構(gòu)與任務(wù)調(diào)度

React 18 使用 Fiber 架構(gòu)來(lái)管理渲染任務(wù)。Fiber 節(jié)點(diǎn)包含組件的類(lèi)型、狀態(tài)、props 等信息,并且允許 React 在渲染過(guò)程中暫停和恢復(fù)。

Fiber 架構(gòu)使用雙端隊(duì)列(work-in-progress tree 和 current tree)來(lái)管理渲染任務(wù)。當(dāng)開(kāi)始渲染時(shí),React 會(huì)從根節(jié)點(diǎn)開(kāi)始,遍歷組件樹(shù)并創(chuàng)建 Fiber 節(jié)點(diǎn)。

這些 Fiber 節(jié)點(diǎn)會(huì)被放入 work-in-progress tree 中,表示正在進(jìn)行中的渲染任務(wù)。同時(shí),current tree 中保存著上一次渲染的結(jié)果,用于在渲染過(guò)程中進(jìn)行比對(duì)和更新。

下面是一個(gè)簡(jiǎn)單的示例,展示如何使用 startTransition 來(lái)區(qū)分緊急和非緊急的更新任務(wù):

import React, { useState, startTransition } from 'react';

function App() {
  const [text, setText] = useState('');
  const [isPending, setIsPending] = useState(false);

  const handleChange = (event) => {
    // 標(biāo)記為非緊急更新開(kāi)始
    setIsPending(true);

    // 使用 startTransition 將更新放入待處理隊(duì)列
    startTransition(() => {
      setText(event.target.value);
      // 假設(shè)這里還有其他非緊急的更新操作
    });

    // 立即更新pending狀態(tài)為false,表示非緊急更新已安排
    setIsPending(false);
  };

  return (
    <div>
      <input value={text} onChange={handleChange} />
      {isPending ? 'Updating...' : 'Ready'}
    </div>
  );
}

export default App;

在上面的代碼中,當(dāng)用戶(hù)輸入時(shí),handleChange 函數(shù)會(huì)被調(diào)用。我們使用 setIsPending(true) 來(lái)標(biāo)記一個(gè)非緊急更新的開(kāi)始。然后,通過(guò) startTransition,我們將實(shí)際的更新操作(設(shè)置輸入框的值)放入待處理隊(duì)列中。這個(gè)更新現(xiàn)在被標(biāo)記為非緊急的,并將在瀏覽器空閑時(shí)執(zhí)行。最后,我們立即將 isPending 狀態(tài)更新為 false,以在界面上顯示“Updating...”狀態(tài),告知用戶(hù)更新正在進(jìn)行中。

2. 中斷與恢復(fù)

并發(fā)渲染的另一個(gè)關(guān)鍵特性是中斷與恢復(fù)的能力。在渲染過(guò)程中,如果瀏覽器資源緊張或有其他高優(yōu)先級(jí)的任務(wù)需要執(zhí)行,React 可以暫停當(dāng)前的渲染任務(wù),釋放資源給更重要的任務(wù)。一旦資源變得可用,React 會(huì)恢復(fù)之前的渲染任務(wù),并繼續(xù)執(zhí)行剩余的小任務(wù)。

這種中斷與恢復(fù)的能力使得 React 能夠更好地適應(yīng)瀏覽器的資源狀況,避免長(zhǎng)時(shí)間的阻塞和卡頓。它確保了即使在復(fù)雜的應(yīng)用中,用戶(hù)也能獲得流暢且響應(yīng)式的體驗(yàn)。

3. 時(shí)間切片

時(shí)間切片允許 React 將長(zhǎng)時(shí)間的渲染任務(wù)拆分成多個(gè)較短的時(shí)間片,以避免阻塞主線程。雖然 React 內(nèi)部自動(dòng)管理時(shí)間切片,但開(kāi)發(fā)者可以通過(guò)控制更新任務(wù)的優(yōu)先級(jí)來(lái)間接影響時(shí)間切片的分配。

在上面的示例中,通過(guò) startTransition,我們實(shí)際上是在告訴 React:“這個(gè)更新不是非常緊急,你可以在其他高優(yōu)先級(jí)的任務(wù)完成后,或者瀏覽器空閑時(shí)再進(jìn)行。”

總結(jié)

React 18的并發(fā)渲染特性通過(guò)引入Fiber架構(gòu)和startTransition等方法,實(shí)現(xiàn)了更加靈活和高效的渲染控制。它允許開(kāi)發(fā)者將更新操作拆分為緊急和非緊急兩類(lèi),并根據(jù)瀏覽器的資源狀況進(jìn)行動(dòng)態(tài)調(diào)度。通過(guò)合理利用這些新特性,我們可以?xún)?yōu)化React應(yīng)用的性能,提升用戶(hù)體驗(yàn),為項(xiàng)目帶來(lái)更多的價(jià)值。

責(zé)任編輯:趙寧寧 來(lái)源: 前端歷險(xiǎn)記
相關(guān)推薦

2022-05-10 09:14:15

React 并發(fā)渲染

2023-07-19 15:45:47

ReactDOM輕量級(jí)

2024-08-29 08:31:16

2014-03-12 10:31:32

大數(shù)據(jù)

2023-04-20 10:15:57

React組件Render

2022-03-31 17:54:29

ReactHooks前端

2014-06-05 18:01:49

互聯(lián)網(wǎng)化變革

2015-09-02 09:37:48

2018-06-04 10:11:51

馬云藥店智慧藥店

2013-12-23 09:37:16

Fedora開(kāi)源Fedora 19

2023-04-06 09:41:00

React 組件重渲染

2021-11-16 14:21:02

React 開(kāi)發(fā) Beta

2015-05-11 11:06:43

統(tǒng)一基礎(chǔ)架構(gòu)系統(tǒng)華三通信UIS

2017-12-20 11:55:38

RAID2.0傳統(tǒng)方式

2021-03-12 18:25:09

開(kāi)發(fā)前端React

2011-07-05 11:33:27

2013-08-06 17:38:20

2018-09-10 11:00:21

區(qū)塊鏈互聯(lián)網(wǎng)新聞行業(yè)

2022-10-14 08:45:54

2015-11-05 11:27:42

云計(jì)算傳統(tǒng)科技巨頭
點(diǎn)贊
收藏

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