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