標題有點“點擊誘餌”,但想法並沒有錯。
我並不認為 useEffect 是個不好的 hook,其實恰恰相反。但在作為派生機的 React 中,使用 useEffect 進行狀態同步並不是最好的選擇,核心團隊也不推薦。
但等等,如果我有需要同步狀態的狀況?
是的,這是非常罕見的情況,也許有更好的解決方案選項,但想像一下我們在應用程式中有一個帖子,並且當用戶單擊“喜歡”按鈕時,我們希望有一個本地狀態來處理樂觀更新,但它與外部狀態(來自後端)同步,以真正了解是否發生了類似情況。
可變的派生
在這種情況下,我們需要一個可以同時進行狀態和推導的原語。從概念上講,我們可以將其視為可變推導。 Ryan Carniato 有一篇關於它的很好的部落格文章,但是存在一些與 React 管理反應性的方式相關的限制,但是這個新的原語將是推導和狀態:
派生作為預設行為,取得最後更新的事實來源(來自伺服器的資料道具)。
說明使用者何時點選「喜歡」按鈕。此變更是臨時的,將在下一次依賴項變更時被覆蓋。
當然,我們在 React 上沒有它,但我們可以想像這樣的原語。它的優點:
- 它從 useEffect 中又刪除了一個用例。
- 它清楚地表明我們有一個可以作為狀態處理的推導。
使用MemoState
const [internalState, setInternalState] = useMemoState(() => data, [data]);
鉤子像普通的useMemo一樣接受兩個參數,第一個參數是memo函數,通常在第一次執行,傳回值將是狀態。第二個參數是眾所周知的依賴項數組,用於追蹤值並在必要時重新計算備忘錄。它傳回一個包含兩個值的元組,即狀態/備忘錄值和臨時更改狀態的設定器。
使用鉤子就像這個例子:
function MemoState ({ data }: { data: State}) { const [internalState, setInternalState] = useMemoState(() => data, [data]); return () } name: {internalState?.title}
{internalState?.like ? "liked post" : "not liked post"}
透過這種方式,您可以消除這裡對 useEffect 的需求,確切地知道這個鉤子正在做什麼和能夠做什麼,並填補這個概念空白,我們的問題同時需要一個狀態和一個派生。諷刺的是,它因此消除了對效果的需要。
我們如何在 React 中做類似的事情?
為了遵循 React 規則並保持鉤子安全,我們需要使用 useEffect 在今天的 React 中創建類似的東西。我不認為將來會做出這樣的鉤子,但誰知道呢,對吧?
為了避免在這裡使用 useEffect,我們需要使用一些外部程式碼(例如迷你狀態函式庫)來處理它,或者如果我們想保留嚴格的 React 原語,則使用 useRef 來保持值的同步。
這種方法的問題在於它違反了 React 規則,而且文件不建議這樣做。因為它在沒有效果的情況下工作的唯一方法是在元件渲染期間同步引用,一點也不安全。
因此,為了保持簡單和安全,hook 的例子如下:
const [internalState, setInternalState] = useMemoState(() => data, [data]);
以上是動態推導及其殺死useEffect的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何對多個鏈接進行並發GET請求並依次判斷返回結果?在Tampermonkey腳本中,我們經常需要對多個鏈...


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

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

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。