帶鉤子的 React 中不存在生命週期
很久很久以前,我們在類別中使用了 React,還記得嗎?
當時,我們有了生命週期方法的概念,即接受在特定時刻執行的回調的類別上的方法。三巨頭:裝載時、更新時、卸載時。
古老但黃金的課程
這很重要,在類別元件上,傳回的 JSX 是在 render 方法上產生的,狀態附加到元件的 this 上,並且應用程式開發人員需要一種方法來知道在某些時刻執行操作。我們對組件生命週期的時間有了概念:
- componentDidMount 是元件首次渲染並為 DOM 添加元素的時刻,也是開始連接和 API 請求等副作用的時刻。
- shouldComponentUpdate 可讓您手動設定邏輯來比較下一個 props 和狀態,並傳回布林值來定義是否可以跳過重新渲染。
- componentDidUpdate 是狀態或 props 變更的時刻,再次呼叫 render 方法並對身分差異進行協調變更並應用於 DOM,有助於將狀態與新 props 同步並執行邏輯操作。
- componentWillUnmount 是 React 將從 DOM 中刪除元素的時候,是清理內容和避免記憶體洩漏的好地方。
當然,您有一個重要的 API,例如forceUpdate,如果您使用的外部資料無法與 React 狀態更新連接,它允許您手動觸發重新渲染。
在概念層面上,我們有一種更直接的方式來執行應用程式的流程。生命週期方法遵循 DOM 元素的類似生命週期,您可以自行執行 memo 和 forceUpdates,同步狀態是執行邏輯的預設方式。
這種直接性被認為是簡單的,與反應式模型相比,學習這些概念更容易。但後來,Hooks 出現並改變了一切。
未命名的反應性
過渡令人困惑。首先,為了讓開發變得簡單,並在某種程度上維護開發人員所擁有的 React 模型的概念願景,許多交流試圖展示 hooks 模型的相似之處。為了擁有 3 個主要的生命週期方法,他們展示了 useEffect 的解決方法。
// componentDidMount useEffect(() => { // code... // componentWillUnmount: return function cleanup() { // code... }; }, []); // componentDidUpdate useEffect(() => { // code... }, [dependencyState, dependencyProp]);
所以,大多數用 hooks 寫的新 React 程式碼都遵循這個想法,開始同步狀態是一個自然的過程。為了保持生命週期方法的相同理念,這是呼叫 setState 並觸發重新渲染過程的地方。
有什麼問題嗎?
同步狀態成為問題,useEffect 的錯誤使用成為問題,雙重重新渲染成為問題,太多重新渲染成為問題,效能成為問題。
React 的這一步有點令人困惑,至少對我來說是這樣。因為,轉向鉤子就是轉向反應式模型,即使它是一個粗粒度的模型。但傳達的訊息是,沒有什麼大的改變。沒有關於反應性概念和理論的內容,即使使用 React 多年,我也只是閱讀 Ryan Carniato 關於反應性和固體的部落格文章才開始真正理解反應性。
即使知道 useEffect 有一個誤用,我真的不明白為什麼,而且缺乏關於反應性的概念理論使得鉤子很容易犯錯。 useEffect 成為最令人討厭的 hook,被一些人稱為“useFootgun”。關鍵是,React 中存在概念上的混亂,表現為我們今天看到的 useEffect 的所有問題。
useEffect問題不是問題的原因,而是問題的結果。
鉤子的生命週期怎麼樣
所以,這就是事情。反應性的概念中沒有生命週期。
你發生了變化,你對它做出反應,產生副作用。效果是結果,不是原因。沒有狀態同步,也沒有掛載和卸載的概念。
無論是卸載前的第一個、第十個還是最後一個渲染都沒有關係,而且鉤子不關心它,順便說一句,甚至 useEffect。
試試看:
// componentDidMount useEffect(() => { // code... // componentWillUnmount: return function cleanup() { // code... }; }, []); // componentDidUpdate useEffect(() => { // code... }, [dependencyState, dependencyProp]);
您將在控制台上看到每次狀態更新時都會執行這兩個函數。首先是清理,然後是效果回調。如果您使用帶有某些狀態或屬性的 useEffect 來進行訂閱,則每次依賴項發生變更時,都會呼叫清理函數,然後呼叫新的回調,再次進行訂閱,但使用新值。
您應該將應用程式程式碼視為簡化的 React 模型:
function EffectExample() { const [count, setCount] = useState(0); useEffect(() => { console.log('effect', count); return () => { console.log('clean up', count); } }, [count]); return ( <button onClick={() => setCount((state) => state + 1)}> {count} </button> ) }
如果您有這樣的組件:
UI = fn(state)
當您點擊按鈕並將計數加 1 時,您真正擁有的概念上是這樣的:
function Example() { const [count, setCount] = useState(0); return ( <button onClick={() => setCount((state) => state + 1)}> {count} </button> ) }
每次點擊都會再次呼叫 fn,並使用新的狀態,產生新版本的 UI。狀態應該透過使用者的操作或透過非同步派生產生的非同步值來更改。
這樣你就可以保持乾淨的想法:
- 狀態轉換進行新的 fn 呼叫
- 在新狀態下,您將獲得 UI 描述
- 如果不同,請更新螢幕。
一個乾淨且一致的模型。
渲染器需要關心在螢幕上新增、更新和刪除元素。在組件級別,重要的是:
- 如果狀態改變
- 應用程式是否可以處理使用者操作
- JSX 中傳回的結構。
Hooks 及其響應式模型使 React 與瀏覽器解耦,使應用程式程式碼不必關心您處於螢幕渲染過程的哪個時刻。您不再強制更新,甚至不再按照自己的規則處理備忘錄,這對於應用程式開發人員來說不太直接,但在模型方面更直接。
每次重新渲染都會產生一個結構,React 負責剩下的事情。
以上是帶鉤子的 React 中不存在生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。
