筆記
單圖精華:

提升內聚性
如果狀態彼此之間帶有強烈關聯,使用一個 useState 變數集中管理即可。比如下列的「信用卡號」「卡片有效日期」「持卡人姓名」其實可以集中到「付款資訊」一個變數中:
// don'tconst [cardNo, setCardNo] = useState("");const [cardExpDate, setCardExpDate] = useState("");const [cardHolderName, setCardHolderName] = useState("");
// doconst [cardInfo, setCardInfo] = useState({ no: "", expDate: "", holderName: "",});如果不確定狀態們是否「有關」,可以根據「這些資料是否會包成一個 request body 送到後端」來判斷。
當你發現自己經常「同時執行多組 state set」時,可考慮是否該將這些狀態包在一起(參考上述),或是改用 useReducer 來管理:
// don'tsetUser(user);setIsLoading(false);
// do: update multiple states in one dispatchdispatch({ type: "save-user", payload: user });偏好推導
在透過 useEffect 監聽前兩組狀態變數,以計算第三個狀態變數時,請確認「第三個變數」是否真的需要被 useState 管理:
// don'tuseEffect(() => { setFullName(`${firstName}, ${LastName}`);}, [firstName, lastName]);
// doconst fullName = `${firstName}, ${LastName}`;多使用推導(derive)來計算值,有時候你不需要這麼多組 useEffect / useState 😇
避免在 useEffect 中呼叫 api
影片看法:避免在 useEffect 中呼叫 api 來取得資料,請考慮使用 custom hook 或現成的第三方套件(React Query, SWR 等)來處理 api 互動。
react 官方文件的看法:直接在 useEffect 裡面呼叫 api 不是不行,但要記得處理 race condition 以及元件卸載(unmount)時清空本地狀態。