## 目錄 - 文章 - 作者 - 一些心得 --- ## 文章 [A Complete Guide to useEffect](https://overreacted.io/a-complete-guide-to-useeffect/#tldr) - by Dan Abramov --- ## 作者 ![](https://pbs.twimg.com/profile_images/1545194945161707520/rqkwPViA_400x400.jpg) - Redux 的作者 - 目前是 Meta React 的核心開發團隊成員之一 --- ## `useEffect` ```javascript! useEffect(setup, dependencies?) ``` ![](https://hackmd.io/_uploads/S1Hn3E45h.png) NOTE: 藍色 setup 會執行的程式 黃色 cleanup 下一次 setup 前及元件移除時會叫用的程式 藍紫色 dependencies 供 React 記錄用,優化 setup 執行的手段 --- ## DOM 先繪製,才做 setup >React will let the browser paint the updated screen first before running your Effect. https://react.dev/reference/react/useEffect NOTE: 不是執行到 useEffect 就執行,是會等到 DOM 繪製完畢 --- ## Synchronization, Not Lifecycle https://codesandbox.io/s/synchronization-not-lifecycle-5dxj4j --- ## dependencies 應以效能優化的手段出發,而不是以「什麼時候可以叫用」setup 為導向 https://codesandbox.io/s/synchronization-not-lifecycle-5dxj4ja NOTE: 可以發現沒有再叫用 effects 了 --- ## setup -> checked -> cleanup? -> setup -> loop... https://codesandbox.io/s/synchronization-not-lifecycle-with-clean-up-fhj5th React will compare each dependency with its previous value using the Object. (與嚴格等於 `===` 近 90% 相同) https://react.dev/reference/react/useEffect NOTE: 執行 setup -> 比對 -> 有差異 -> 執行 cleanup -> setup -> 無限重複 --- ## 每次 render 都是自己的 scope,有自己全部的東西 ```javascript! // During first render function Counter() { // ... useEffect( // Effect function from first render () => { document.title = `${0} - Hello`; } ); // ... } // After a click, our function is called again function Counter() { // ... useEffect( // Effect function from second render () => { document.title = `${1} - Hello`; } ); // ... } // After another click, our function is called again function Counter() { // ... useEffect( // Effect function from third render () => { document.title = `${2} - Hello`; } ); // .. } ``` NOTE: 上方範例的流程分解 --- https://codesandbox.io/s/lyx20m1ol --- ## 因為 dependencis 是攸關 setup(effects) 的優化,因此必須對 dependencies 誠實 非 setup 範疇內的值必須放入 dependencis,讓 React 知道什麼時候該繼續執行 setup https://codesandbox.io/s/synchronization-not-lifecycle-dependency-67qy9j --- ```javascript! useEffect(() => { document.title = 'Hello, ' + name; }, []); // Wrong: name is missing in deps ``` ![](https://overreacted.io/25f75db3f9f57ffe1426912093577445/deps-compare-wrong.gif) --- ![](https://overreacted.io/04a90dcbacb01105d634964880ebed19/exhaustive-deps.gif) NOTE: 大概講一下範例,先看,然後說 refactor 的準則 --- ## 參考資料 - [A Complete Guide to useEffect](https://overreacted.io/a-complete-guide-to-useeffect/#tldr) - [useEffect](https://react.dev/reference/react/useEffect)
{"description":"文章","title":"[React] A Complete Guide to useEffect 的閱讀筆記(工作分享會)","contributors":"[{\"id\":\"b3f8e95e-e370-4508-94b8-608e400399b8\",\"add\":3201,\"del\":219}]"}
    620 views