當 props 是一個callback function 時,React.memo 需要搭配 useCallback 使用
我們先來看看 props 是個 callback function 時,我們不做些什麼會怎樣
state 叫 bar ,還有個按鈕,每次點它都會更新 bar ,使 App 被重新渲染。handleClick,作為 props ,傳遞下去給 <Foo /> 元件。React.memo 對 <Foo /> 元件做優化,希望 handleClick 作為 props 傳遞下來,期待此props 沒有變化時,我們就不重新渲染 <Foo> 。bar。<Foo /> 不被重新渲染 ( 因為handleClick 這個 callback 至始至終都一樣 )function App() {
const [bar, setBar] = useState(0);
const handleClick = () => console.log("Button is clicked");
return (
<div className="App">
<button onClick={() => setBar((bar) => bar + 1)}>點我</button>
Render App {bar}
<Foo handleClick={handleClick} />
</div>
);
}
const Foo = React.memo(({ handleClick }) => {
console.log(" === render Foo ===");
return (
<div className="foo">
<div>
<button onClick={handleClick}>點我</button>
執行 Callback from App (props)
</div>
</div>
);
});
結果打開我們的 console ,發現 點擊 App 中的【點我】按鈕嘗試更新 bar,底下 <Foo /> 元件都會被重新渲染。因為...
bar 每次更新時,App 都會重新渲染,因此也會重新執行 const handleClick = () => console.log("Button is clicked"); 這一行。<Foo /> 元件,看似相同的 handleClick 作為 props 傳遞下來,實際為不相同的東西,此話怎講?8787 === 8787 // true 數字型別
"帥" === "帥" // true 字串型別
true === true // true 布林型別
[] === [] // false 陣列型別
{} === {} // false 物件型別
const a = () => {}, b = () => {}
a === b // false function 是物件的子型別
props 跟 next props , 提供的這個 handleClick 對於 <Foo /> 元件而言,是不相同的東西。 可參考JavaScript 是「傳值」或「傳址」?
useCallback 記憶住它。props 是 callback 時, useCallback 與 React.memo 是個組合技,兩者必須一起使用。題外話補充
呼應昨天~也因此你的props是 物件(Object) 或 陣列(Array)時,React.memo才會另外提供第二個參數,協助我們做更精確的判斷function areEqual(prevProps, nextProps) { /* 只 return true 或 false */ }`
How
show me the code
demo codesandbox
在原本的code當中
- const handleClick = () => console.log("Button is clicked");
+ const handleClick = useCallback(() => console.log("Button is clicked"), []);
React 官網也有提到 useCallback(fn, deps) 相等於 useMemo(() => fn, deps)。
而關於 useCallback 第二個參數 deps,則是你希望當什麼 state / props 發生改變時,你希望重新創建這個 function 的 instance。
而關於 useCallback 還有其他很棒的參考文章,提供連結如下:
如何錯誤地使用 React hooks useCallback 來保存相同的 function instance
大大的範例真的幫助很多QwQ 感恩!
彻底理解 React hook useCallback和useMemo的区别
Your Guide to React.useCallback()
【译】什么时候使用 useMemo 和 useCallback
什麼時候該使用 useMemo 跟 useCallback
React Hooks(二): useCallback 之痛
React 性能優化那件大事,使用 memo、useCallback、useMemo
useCallback ?props 是引用 reference ,像是 callback function
props 是 callback 時, useCallback 與 React.memo 是個組合技,兩者必須一起使用。深入探討 JavaScript 中的參數傳遞:call by value 還是 reference?
重新認識 JavaScript: Day 05 JavaScript 是「傳值」或「傳址」?
如何錯誤地使用 React hooks useCallback 來保存相同的 function instance
【译】什么时候使用 useMemo 和 useCallback