P粉8348408562023-08-19 00:29:53
是的,這是正確的。每次渲染都會建立一個新的函數,然後新的函數會被快取的函數所取代。
加速並不是因為跳過了創建函數的步驟,而是因為其他程式碼能夠跳過它們自己的工作。這是因為如果它們每次都傳遞相同的函數,它們就知道沒有相關的內容發生了變化。
例如,如果您需要將handleChange
傳遞給useEffect
的依賴數組中,每次都傳遞一個穩定的引用非常重要,否則該effect將在每次渲染時重新運行:
useEffect(() => { // ... 使用handleChange做一些事情 }, [handleChange]);
或者,如果handleChange
作為prop傳遞給一個元件,並且該元件想要使用React.memo
跳過渲染。只有在props沒有改變時,才能跳過渲染:
const Parent = () => { const handleChange = useCallback((ev) => { setMsg(ev.target.value); }, []); return <Child handleChange={handleChange}/> } const Child = React.memo(({ handleChange }) => { // ... 使用handleChange做一些事情 })