首頁 web前端 js教程 usePrevious 和類似的面向時間的鉤子的問題

usePrevious 和類似的面向時間的鉤子的問題

Dec 27, 2024 pm 06:52 PM

The problem with usePrevious and similar time oriented hooks

Theo 本週製作了一個關於React hooks 不直觀行為的視頻,特別探索了一個名為usePrevious 的hook 的想法,以在當前渲染之前保留上次重新渲染的值版本一。一種對新舊狀態進行邏輯處理的方法。

如果您想了解如何實現它的想法,請查看視頻,在這篇文章中,我們的想法是探索像 usePrevious 這樣的鉤子的概念方面。

反應式表達

如你所見,我們在 React 中沒有這樣的原始鉤子。在 hooks 之前,在基於類別的時代,我們有一個名為 componentDidUpdate 的生命週期方法,我們將之前的所有狀態和 props 作為參數,為什麼他們不使用 hooks 來保留這種行為?

如果您正在閱讀本系列文章,可能會有點重複,但在這種情況下,我們需要討論範式轉移。

對於類,當某些狀態更新時,您沒有自動重新計算派生值的方法。如果你正在使用一些特定的 props 和 state 來計算一些新的值,你需要自己驗證其中一些是否發生了變化。

這樣,解決方案是在所有更新中呼叫回調,並將先前的值傳送給使用者。應用程式程式碼檢查差異並使用新結果更新計算狀態。這就是基於類別的元件的直接性,你完全控制資料的流向,並且需要手動控制計算。

我們來看看反應表達式。

您不必檢查並進行更改,而是編寫一個表達式、計算公式之類的。此計算需要使用目前狀態版本執行,而無需存取前一個狀態。

想像一個公式:

a = b + c


b = 10
c = 20


a = 10 + 20
a = 30
登入後複製
登入後複製

如果我使用這個表達式 100 萬次,將 b 作為 10 傳遞,將 c 作為 20 傳遞,我將得到相同的結果。這是純粹的計算。 React 執行相同的原理。所有推導的計算都應該是純粹的。

但是為什麼它很重要?

在重新渲染中做出反應。每個週期都會產生 UI 的描述,並根據當前和下一週期之間的差異,將變更提交到 DOM。每個渲染都與上一個或下一個完全分離。

UI = fn(state)
登入後複製
登入後複製

因此,對於每個不同的狀態版本,我們都有不同的 UI 版本。如果我們在這裡添加以前的值,這會變得非常混亂。因為現在它不僅取決於狀態,還取決於之前的狀態。我可以擁有多個來源,也許更複雜的表達式來處理這些來源,並且結果是不一致且不可預測的 UI,而不是只有一個來源、一個表達式和一個結果。

每個渲染都會根據先前的狀態表現不同。由於 usePrevious 的一些可能實作依賴於 React 中的時間順序,這變得更加危險。

借助並發功能,React 可以在不警告渲染的情況下停止,以優先考慮其他操作。根據 useEffect 和 ref 可以讓您保留「上一個」渲染的過時版本,甚至是真正的上一個渲染。更多混亂需要推理。

記憶化

用這樣的表達方式思考

a = b + c


b = 10
c = 20


a = 10 + 20
a = 30
登入後複製
登入後複製

其中一部分是優先順序的,需要先計算一下,我們用javascript程式碼來思考一下:

UI = fn(state)
登入後複製
登入後複製

所以現在我們有兩個獨立的表達式,可以單獨計算,而且是完全純淨的。但如果b的值變化很大,cdResult的計算成本很高,我們該如何解決呢?牢牢記住!

a = b + (c - d)
登入後複製

現在如果 c 或 d 發生變化,cdResult 將被重新計算。

但是在上面的文字中我說沒有先前的值,但是一個渲染的計算如何可以在下一個渲染中使用?這不會破壞計算的純粹性嗎?

事實上,沒有。例如:

const cdResult = c - d;
const a = b + cdResult;
登入後複製

假設我們處於渲染編號 1 中。 c 的值為 30,d 的值為 20,因此結果是 10。但是當我記住它時,React 將追蹤我添加的依賴項數組。如果其中一些發生變化,則會重新計算。

const cdResult = React.useMemo(() => c - d, [c, d]);
const a = b + cdResult;
登入後複製

但他們沒有改變。如果我再次呼叫這個表達式,c 為 30,d 為 20,我將得到相同的 10 作為結果。即使我處於渲染編號 2 中且其他變數發生了變化,但我在本次計算中使用的依賴項並沒有改變。

我可以在每次渲染中再次計算它,這是React的預設行為,但我可以選擇跳過不必要的重新計算,這將返回相同的值,所以我保留了它。我們保持了純度並保持了渲染之間的分離

之前的狀態

但是有一個很好的地方可以對先前的狀態、使用者操作進行邏輯處理。當然,在呼叫回調的那一刻,這將是當前狀態。但如果你有一些狀態需要根據某種邏輯進行更改,那就是這個地方。

當然,它可能有非常特殊的情況,您可能需要一個鉤子,例如 usePrevious,但要注意它可能導致的不一致,並嘗試添加保證以避免應用程式上的錯誤。

更重要的是,如果可能的話,避免它。

以上是usePrevious 和類似的面向時間的鉤子的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1659
14
CakePHP 教程
1416
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1232
24
神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

See all articles