「快速重新整理」是在編輯 React 元件時可以獲得立即回饋的一個功能。9.4 或更新的版本中,這個功能在所有 Next.js 的應用程式中預設是開啟的。隨著這個功能的開啟,幾乎所有的編輯都在不會遺失元件的狀態下快速被看見。
如果你在開發時不小心有一個語法錯誤,你可以修正並再一次儲存。此錯誤將會自動地消失,你將不需要重新載入應用程式,同時也不會遺失元件狀態。
如果犯的錯誤導致在元件內產生一個運行錯誤,你將會看到一個上下文覆蓋提醒。修復錯誤後將會自動地忽略該提醒而不會重新載入應用程式。 如果重新渲染期間沒有發生錯誤,元件狀態將會被保留。如果發生錯誤,React 會將更新後的程式碼重新安置在應用程式上。
如果你的應用程式內有錯誤邊界,對於生產階段來說若能有容錯空間是一個不錯的主意,它們會在渲染錯誤後,將針對下一次的修正再次嘗試渲染。這意味著具備「錯誤邊界」可以預防經常性地重置到根部應用程式狀態。然而,要記住的是,「錯誤邊界」不該太過著重在細節。它們在生產階段被 React 使用,且必須是刻意被設計的。
「快速重新整理」嘗試保留你所編輯的本地 React 狀態,但這僅在一切是安全的前提之下才能進行。以下是你每次編輯檔案時都會重置本地狀態的可能原因:
HOC(包裝元件)
;如果返回的元件是一個 class,它的狀態將會被重置。export default () => <div />;
將導致「快速重新整理」以致於不會保留本地的元件狀態。針對大型的程式碼庫,你可以使用我們的 name-default-component
codemod。隨著你的程式庫越來越多轉移至使用 函式元件和 Hooks,你可以期待在更多情境下狀態是被保留的。
// @refresh reset
,這對於檔案來說是本地指令,它在每次編輯時指示「快速重新整理」重新掛載檔案內被定義的元件。console.log
或 debugger
在你所編輯的元件內。可行的狀況下,「快速重新整理」會企圖在編輯之間保留元件的狀態。特別是 useState
和 useRef
,只要不去改變它們的參數或者是 Hook 呼叫的順序,它們保留的是之前的值。
包含相依性的 Hooks,如 useEffect
、useMemo
和 useCallback
在「快速重新整理」期間會 一直 更新。它們的相依性在重整期間將會被忽略。
舉例來說,當你更改這個 useMemo(() => x * 2, [x])
到 useMemo(() => x * 10, [x])
,這將會導致重新運行,即使 x
(相依性)並沒有改變,如果 React 不這樣做,你的編輯將無法呈現在螢幕上。
有時候,這將導致不可預料的結果,例如:即使是帶有一個空陣列作為相依性的 useEffect
也會在「快速重新整理」期間重新運行一次。
然而,試圖寫出對偶爾重新運行 useEffect
有彈性的程式碼,即使沒有「快速重新」也是一個不錯的實踐。這將使你之後更容易向其引入新的相依性,它由 React React 嚴格模式強制執行,我們強烈建議啟用該模式。