React 18 在今年稍早推出了穩定版,聽說解決了很多長久以來的問題,所以花了點時間,體驗看看這些新功能,並且統整一下,寫成今天的文章
React 18 新加的功能之一,就是 Transition
, 作用在於將State分為 緊急(Urgent)
及 非緊急(Non-urgent)
兩種,Transition 對應的也就是 非緊急的state
更新。
const [isPending, startTransition] = useTransition();
startTransition(()=>{
// 顯示Todo 內容的狀態更新不是緊急至必須馬上有反應。
setTodos(todos);
})
// isPending用來表示該Transition 是否已經完結。
如果不需要 isPending ,可以改寫成:
import { startTransition } from 'react';
useDeferredValue 主要是解決一直重複 render 的行為,大家都知道 React 是資料驅動畫面,所以當如果取得資料上面有延遲,那麽畫面上就會有卡頓的感覺
傳統上會用 debounce 來解決這類的問題,但是跟 debouce 不一樣的是 useDeferredValue 是 被觸發後
才做回傳更新後的資料,引發 re-render,而 debounce 是 不管有沒有需要
,都會固定去觸發
p.s. 依賴 deferred value 的 child component 要記得使用 useMemo,避免不必要的 re-render
const deferredValue = useDeferredValue(value);
// 參數是設定要延遲的 value 值
// 最後返回一個延遲的值 deferredValue
以下是我個人對於使用上的感覺,或許不是絕對
體驗下來感覺這兩個使用起來差不多,都是將事件狀態改成 Non-urgent
,不過可監聽的對象數量不一樣,useTransition 可針對多個狀態一次改成 Non-urgent,useDeferredValue 感覺是針對單一狀態去改變
useId is a hook for generating unique IDs that are stable across the server and client
Note: useId is not for generating keys in a list. Keys should be generated from your data.
記得別把 useId 是用到 list 中,list 中的 keys 應該是要取自於你的資料
const id = useId();
https://andyyou.github.io/2022/01/05/use-sync-external-store-with-solving-problem/
https://milkmidi.medium.com/react-18-usesyncexternalstore-a427bf82c198
useInsertionEffect工作原理類似useLayoutEffect,區別在於回調執行時還不能訪問ref中的DOM節點。
你可以在這個 Hook 內操作全局 DOM 節點。
function useCSS(rule) {
useInsertionEffect(() => {
if (!isInserted.has(rule)) {
isInserted.add(rule);
document.head.appendChild(getStyleForRule(rule));
}
});
return rule;
}
function Component() {
let className = useCSS(rule);
return <div className={className} />;
}
17版以前,只有 useState 會做 Automatic Batching,而其他的非同步行為,例如: Promise, setTimeout,fetch 是不會自動 Automatic Batching ,不過 18 版後這些非同步預設都會自動 Automatic Batching
不過也不是所有的部分都需要 Automatic Batching ,可透過 flushSync 來跳脫 Automatic Batching
flushSync(() => {
setState(true);
});
以上簡單介紹了幾個 React18 新增的 Hooks 跟 Automatic Batching,如果對於 React 18 有興趣的朋友可以去官網看看,下面也整理裡一些參考的文章,方便大家去學習,那麼我們下次見,掰掰~~
文章同步到我的Medium,有興趣的讀者歡迎去看看
參考文章:
https://andyyou.github.io/2022/01/05/use-sync-external-store-with-solving-problem/
https://milkmidi.medium.com/react-18-usesyncexternalstore-a427bf82c198
https://segmentfault.com/a/1190000040966821
https://tecky.io/en/blog/React-18-%E7%99%BB%E5%A0%B4-!-%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD%E5%A4%A7%E7%B0%A1%E4%BB%8B/
https://beta.reactjs.org/
https://gcdeng.com/blog/react-hooks