React.JS v18.0釋出
最新的主要版本包括開箱即用的改進,如自動批處理、startTransition 等新 API,以及支援 Suspense 的流式伺服器端渲染。
React 18中的許多功能都是建立在我們新的併發渲染器之上的,這是一個幕後的變化,釋放了強大的新功能。併發React是可選的--只有當你使用併發功能時才會啟用--但我們認為它將對人們構建應用程式的方式產生重大影響。
我們花了數年時間研究和開發對React併發的支援,我們還特別注意為現有使用者提供一個漸進的採用路徑。
併發本身並不是一個功能。它是一種新的幕後機制,使React能夠同時準備多個版本的UI。你可以把併發看作是一個實現細節--它的價值在於它所解鎖的功能。
React在其內部實現中使用了複雜的技術,比如優先順序佇列和多重緩衝。但你不會在我們的公共API中看到這些概念。
當我們設計API時,我們試圖向開發者隱藏實現細節。作為一個React開發者,你專注於你想要的使用者體驗,而React處理如何提供這種體驗。
自動批處理
批處理是指React將多個狀態更新分組到一個重新渲染中,以獲得更好的效能。如果沒有自動批處理,我們只對React事件處理程式中的更新進行批處理。預設情況下,React不會對promises、setTimeout、本地事件處理程式或任何其他事件中的更新進行批處理。有了自動批處理,這些更新將被自動批處理。
Transitions
過渡transition 是React的一個新概念,用於區分緊急和非緊急更新。
立急更新反映了直接的互動,比如打字、點選、按壓等等。像打字、點選或按壓這樣的緊急更新,需要立即響應,以符合我們對物理物件行為方式的直覺。否則他們就會感覺 "不對勁"。
然而,過渡是不同的,過渡transition更新則是將使用者介面從一個檢視過渡到另一個檢視。因為使用者並不期望在螢幕上看到每個過渡過程的中間值。
Suspense
在React 18中,你可以開始使用Suspense在Relay、Next.js、Hydrogen或Remix等有意見的框架中進行資料獲取。使用Suspense進行特別的資料獲取在技術上是可行的,但仍不建議作為一般策略。
如果元件樹的某一部分還沒有準備好被顯示,暫停讓你宣告性地指定它的載入狀態。
<Suspense fallback={<Spinner />}> <Comments /> </Suspense> |
Suspense使 "UI載入狀態 "成為React程式設計模型中的第一類宣告性概念。這讓我們可以在它上面建立更高層次的功能。
新的客戶端和伺服器渲染API
在這個版本中,我們利用機會重新設計了我們為客戶端和伺服器上的渲染所暴露的API。這些變化允許使用者繼續使用React 17模式下的舊API,同時升級到React 18的新API。
- React DOM客戶端
這些新的API現在都是從react-dom/client匯出的。
- createRoot。新的方法來建立一個根來渲染或解除安裝。使用它來代替ReactDOM.render。沒有它,React 18的新功能就不能工作。
- hydrateRoot: 新的方法來給伺服器渲染的應用程式注入水分。使用它代替ReactDOM.hydrate與新的React DOM Server APIs一起使用。沒有它,React 18的新功能就不能工作。
createRoot和hydrateRoot都接受一個新的選項,叫做onRecoverableError,以防你想在React從渲染或水化過程中的錯誤中恢復過來時得到通知,以便記錄。預設情況下,React會使用reportError,或者在舊的瀏覽器中使用console.error。
- React DOM伺服器
這些新的API現在從react-dom/server匯出,並且完全支援伺服器上的流媒體Suspense。
- renderToPipeableStream:用於Node環境下的流媒體。
- renderToReadableStream:用於現代邊緣執行環境,如Deno和Cloudflare工作者。
現有的renderToString方法繼續工作,但不鼓勵使用。
新鉤子
- useId
useId是一個新的鉤子,用於在客戶端和伺服器上生成唯一的ID,同時避免了水化不匹配。它主要適用於與需要唯一ID的可訪問性API整合的元件庫。這解決了一個在React 17及以下版本中已經存在的問題,但在React 18中更加重要,因為新的流媒體伺服器渲染器是如何不按順序地提供HTML的。請看這裡的文件。
- useTransition
useTransition和startTransition讓你把一些狀態更新標記為不緊急。其他狀態更新在預設情況下被認為是緊急的。React 將允許緊急狀態更新(例如,更新一個文字輸入)中斷非緊急狀態更新(例如,渲染搜尋結果列表)。請看這裡的文件
- useDeferredValue
useDeferredValue讓你推遲重新渲染樹的非緊急部分。它類似於debouncing,但與之相比有一些優勢。沒有固定的時間延遲,所以React會在第一次渲染反映在螢幕上後立即嘗試延遲渲染。延遲渲染是可中斷的,不會阻止使用者輸入。請看這裡的文件。
- useSyncExternalStore
useSyncExternalStore是一個新的鉤子,它允許外部儲存支援併發讀取,強制更新到儲存是同步的。在實現對外部資料來源的訂閱時,它消除了對useEffect的需求,並推薦給任何與React外部狀態整合的庫。請看這裡的文件。
- useInsertionEffect
useInsertionEffect是一個新的鉤子,允許CSS-in-JS庫解決在渲染中注入樣式的效能問題。除非你已經建立了一個CSS-in-JS庫,否則我們不希望你使用這個。這個鉤子將在DOM被突變後執行,但在佈局效果讀取新的佈局之前。這解決了一個在React 17及以下版本中已經存在的問題,但在React 18中更加重要,因為React在併發渲染時向瀏覽器讓步,給它一個重新計算佈局的機會。請看這裡的文件。
詳細點選標題
相關文章
- React.JS 18新特性ReactJS
- React.js 實戰 - 元件 & PropsReactJS元件
- React.js 實戰之 元素渲染ReactJS
- [譯] 聽說你想學 React.js ?ReactJS
- Devolver釋出會多款遊戲釋出dev遊戲
- React.js 實戰之 JSX 簡介ReactJS
- React.js 實戰之 事件處理ReactJS事件
- 使用React.js開發Chrome外掛ReactJSChrome
- React.js繫結this的5種方法ReactJS
- 釋出帖子
- openGauss 釋出
- 首次釋出
- Photoshop Elements 2020 for Mac(圖形處理工具) v18.0(2020.01.20)中文版Mac
- K8S釋出策略,無損釋出K8S
- Istio 1.1釋出,中文文件同時釋出
- NPM包(模組)釋出、更新、撤銷釋出NPM
- netcore釋出時 swagger xml釋出丟失問題NetCoreSwaggerXML
- Logstash docker釋出Docker
- Latex 板子釋出
- Fwupd 1.9.9 釋出
- Docker 23.0.4 釋出Docker
- Ubuntu 11.10 釋出!Ubuntu
- TypeScript 4.9 釋出!TypeScript
- wxPython 4.2.0 釋出Python
- NumPy 2.0.0釋出
- Rust 1.79.0釋出Rust
- 小米釋出會
- VirtualBox 6.1.34 釋出
- Rust 1.60.0釋出Rust
- selenium 4.0 釋出
- Ruby 3.1.0 釋出
- SMProxy 1.3.0 釋出 !
- GNOME 3.34 釋出
- Ubuntu 19.10 釋出Ubuntu
- KyPHP 釋出 1.1.0PHP
- Armbian 22.02 釋出
- 測試釋出
- Rust 1.59.0釋出Rust