<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
React 18 引入了一個關鍵的新概念,稱為“Concurrent”。
並行涉及同時執行多個狀態更新,這可以說是 React 18 中最重要的特性。除了並行之外,React 18 還引入了兩個新的勾點,稱為 useTransition() 和 useDeferredValue() 勾點。
它們都有助於降低狀態更新的優先順序,但問題是,何時應該使用它們?
根據官方 React18 Docs,並行 React 是:
一種新的幕後機制,使 React 能夠同時準備多個版本的 UI。您可以將並行視為一個實現細節——它的價值在於它的特性。
並行可以定義為同時執行大量任務的能力。並行並不是一個特性。相反,它是一個幕後功能,它允許 React 同時(並行地)準備許多 UI 範例。 React 以一種對開發人員隱藏實現細節的方式建立 API。 React 建立者認為,React 開發人員應該專注於 React 功能將如何幫助他們實現他們希望為客戶提供的使用者體驗,並且 React 將弄清楚如何提供這種體驗。
Concurrent React 不僅僅是一個實現細節。相反,它是更新框架核心渲染架構的重大升級。因此,瞭解它在 React 18 中是如何工作的至關重要。
對於本文,我建立了一個 Github 儲存庫,在其中我構建了一個簡單的演示產品應用程式,允許使用者通過輸入產品編號來檢視產品。首先,您必須克隆包含所有專案啟動檔案的 Github 儲存庫。要克隆 Github 儲存庫,請轉到終端並執行以下命令:
git clone https://github.com/geekskai/react18-feature.git
完成克隆過程後,轉到專案資料夾,在程式碼編輯器上開啟它,轉到編輯器終端,然後通過執行npm install
或安裝指令碼和依賴項 yarn install
然後,要啟動專案,請執行 npm start
應用程式啟動後,它應該如下所示:
當您第一次輸入產品編號以獲取product時,您會注意到它幾乎會立即更新,即使它是一個包含 10,000 項要瀏覽的超長列表。
現在,當您轉到 Chrome 瀏覽器的開發人員工具部分,轉到效能索引標籤,開啟 CPU 節流並將 CPU 速度降低 4 倍時,問題就開始了。
如果您現在在降低 CPU 速度後嘗試輸入產品編號,您會注意到更新變得更慢且卡頓明顯。甚至整個介面看起來和感覺都很遲鈍,尤其是輸入欄位,現在在我們輸入和刪除時感覺沒有響應。 而這絕對不是一個好的使用者體驗。
你看不到我在打字,但介面響應很慢,如上所示。甚至在 React18 之前,一個標準的解決方案不是一次處理 10,000 個專案或產品(在我們的例子中)。您可以使用分頁或任何其他技術,或者在伺服器端而不是使用者端進行過濾。這些都是您在遇到此類問題時可以考慮的所有可能的解決方案。
但是,如果您需要在使用者端執行這種操作,即在您的使用者端程式碼上,那麼使用 React18,您現在擁有一些工具,可以通過延遲一些狀態更新操作來為使用者提供更好的感知效能通過告訴 React 一些更新操作比其他操作具有更高的優先順序。這就是 React 18 引入的並行以及相關的勾點和函數背後的想法。
useTransition() 告訴 React 一些狀態更新具有較低的優先順序,即每個其他狀態更新或 UI 渲染觸發器具有較高的優先順序。當我們呼叫 useTransition() 時,我們得到一個包含兩個元素的陣列:一個 isPending 布林值,它指示低優先順序狀態更新是否仍處於掛起狀態,以及一個 startTransition() 函數,您可以將狀態更新包裝起來告訴 React這是一個低優先順序的更新。
檢視如何使用 useTransition() 勾點。首先,轉到 App.js 檔案並編輯程式碼,如下所示:
function App() { const [isPending, startTransition] = useTransition(); const [filterTerm, setFilterTerm] = useState(''); const filteredProducts = filterProducts(filterTerm); function updateFilterHandler(event) { startTransition(() => { setFilterTerm(event.target.value); }); } return ( <div id="app"> <input type="text" onChange={updateFilterHandler} /> <ProductList products={filteredProducts} /> </div> ); }
因為 startTransition() 包裝了 setFilterTerm() 狀態更新函數,所以 React 給這個狀態更新程式碼一個較低的優先順序。這可確保輸入欄位保持響應並立即響應演示應用程式中的擊鍵。如果未使用 useTransition(),應用程式可能會變得無響應,尤其是在速度較慢的裝置上。當您輸入產品編號時,您會看到程式碼現在響應速度更快且延遲更少,即使 CPU 已減慢 4 倍。您可以在您的系統上嘗試此操作並檢視結果。
但是,您不應該開始使用 startTransition 來結束所有狀態更新。僅當您的使用者介面較慢時才使用它,尤其是在舊裝置上,或者在您沒有其他解決方案可使用的情況下。這是因為它佔用了額外的效能。
isPending 告訴您當前是否有一些狀態更新仍處於待處理狀態(React 尚未執行,並且優先順序較低。您可以使用 isPending 更新 UI 以在等待主要狀態時顯示一些後備內容更新完成。
我們可以在 App.ts 檔案中的以下程式碼中看到這一點:
return ( <div id="app"> <input type="text" onChange={updateFilterHandler} /> {isPending && <p style={{color: 'white'}}>Updating list..</p>} <ProductList products={filteredProducts} /> </div> ); }
實現程式碼後,您應該能夠在執行應用程式時看到如下內容:
因此,這也是您在使用 useTransition() 時可以使用的功能。另外,請注意觀察實現 useTransition() 功能後它的響應速度有多快。
到此這篇關於一文搞懂 React 18 中的 useTransition() 與 useDeferredValue()的文章就介紹到這了,更多相關React useDeferredValue內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45