React
Optimize
Hooks
useMemo
OptimizeRender
React 優化項目系列,減少大量且不必要的元件重新渲染週期
如何觸發更新的
紀錄 props value
紀錄 func 記憶體位置
紀錄 object value 避免重複執行相關處理
State
的更新流程以及批次更新開始前先來了解 State 的更新流程,以及批次更新。
re-executed
,state 才會是最新的。 ...
const [showParagraph, setShowParagraph] = useState(false);
...
const toggleParagraph = useCallback(() => {
allowToggle && setShowParagraph((pre) => !pre);
// 假如 setShowParagraph 有執行,
// 在這裡印出 showParagraph 一樣會是 false
}, [allowToggle]);
...
}
那如果更新的 state 不止一個的時後,元件是不是就會一直跑 re-executed
像是下面範例,更新兩個 state,所以跑兩次 re-executed
?
不會的,在同一個 block 裡,如果沒有穿插其他非同步項目,React 會將這兩個 state 在同一個 re-executed
行程裡一起做更新。
...
const navHandle = (navPath) => {
// 是不是這裡就會 re-executed 兩次?
setCurrentNav(navPath)
setDrawerIsOpen(false)
};
...
Learn More →
再開發過程中,常常需要對 origin list 做一些處理,可能是 sort, format 或是對某欄位進行複雜運算,如果 origin list 沒有改變,是否我的處理也可以不需要再跑一次。
在 RenderTry
引入 DemoList
export default function RenderTry() {
...
console.log('APP RUNNING');
const [listTitle, setListTitle] = useState('My Title');
const changeTitleHandle = useCallback(() => {
setListTitle('New Title!');
}, []);
...
<h2>{listTitle}</h2>
// 傳進 items
<DemoList items={[5, 3, 1, 10, 9]} />
<Button onClick={changeTitleHandle}>changeTitle</Button>
...
DemoList
import React from 'react';
function DemoList({ items }) {
console.log('DEMO LIST RUNNING!');
const sortList = items.sort((a, b) => a - b);
return (
<>
<ul>
{sortList.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
</>
);
}
// 加上 React.memo
export default React.memo(DemoList);
可以看到 重新整理執行一次更新,點選 btn 更新 state 時,DemoList
也再執行了一次。
這是因為 javascript Object 是傳址的特性,所以對 React.memo 來說,這個 object 是不一樣的
Learn More →
紀錄 object value 避免重複執行相關處理
...
// 將原本傳進去的 items 包裹在 useMemo 裡
const items = useMemo(() => [5, 3, 1, 10, 9], []);
...
<DemoList items={items} />
Learn More →
可以看到 DemoList 就不再重複執行了。
但 useMemo 主要用在當前元件重新渲染時,通過記憶職來避免重複執行,他是無關父元件的。
所以較正確使用,應該是將 useMemo
加在 DemoList 裡面
import React, { useMemo } from 'react';
function DemoList({ items }) {
// 使用 useMemo 儲存記憶值
const sortList = useMemo(() => {
console.log('sortList!');
return items.sort((a, b) => a - b);
}, [items]);
這麼一來當我的 DemoList
外層 props items 未曾改變,但再做其他更新的事情時,就可以避面 sortList 重新做計算的動作!
PrimaryButton type: 'gold' | 'green' | 'dark-green' size: 'mini' | 'small' | 'middle' | 'large'  type: 'gold' | 'blue' | 'purple' size: 'mini' | 'small' | 'middle' | 'large' 
Jan 11, 2023知識背景 編碼 Encode 加密 Encrypt 雜湊 hash 綜合應用 編碼 Encode 換個方式來呈現資料,沒有任何安全性,主要看編碼後的用途 QRcode, UTF8. Base64 等等
May 8, 2022目標客層 想要出租自己的登山或露營等各類戶外用品的使用者 可以是個人群體出租或是商家出租 想體驗戶外活動但還不想花太多錢買裝備的使用者 價值主張 是什麼樣的產品與服務? 租借平台 提供專門的登山露營租賃平台給想要把自己用品出租的使用者
Feb 21, 2022[time=Thu, Feb 3, 2022 5:45 PM] 使用 webpack 編譯打包各個模組後,產生 /dist 目錄資料夾內容供部署至 server 上使用,客戶端在透過瀏覽器訪問此網站獲取內容,然而在獲取內容上是較消耗時間資源的。 瀏覽器使用了緩存的技術,搭配 Webpack 配置將資源緩存至客戶端中,避免每次的重新下載,達到降低網路流量以及服務器的壓力,使網站加載速度更快。 在 web 應用程式中,往往修改較頻繁的是我們的業務邏輯,但是第三方庫則是不會頻繁更動,這時我們可以透過 webpack 合理的劃分我們 chunk。 Webpack 中拆分 chunk 可以分為:
Feb 8, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up