这些都是 React 中的优化钩子,但它们的用途略有不同。
让我们来分解一下:
1。目的:
2。他们返回什么:
3。使用案例:
4。语法:
const memoizedCallback = useCallback( () => { doSomething(a, b); }, [a, b], ); const memoizedValue = useMemo( () => computeExpensiveValue(a, b), [a, b] );
5。性能影响:
让我们看一些例子来说明差异:
使用 useCallback 的示例:
import React, { useState, useCallback } from 'react'; const ParentComponent = () => { const [count, setCount] = useState(0); const handleClick = useCallback(() => { setCount(count + 1); }, [count]); return ( <div> <ChildComponent onClick={handleClick} /> <p>Count: {count}</p> </div> ); }; const ChildComponent = React.memo(({ onClick }) => { console.log('ChildComponent rendered'); return <button onClick={onClick}>Increment</button>; });
在这个例子中,useCallback用于记忆handleClick函数。这很有用,因为 ChildComponent 被包装在 React.memo 中,这意味着它只有在其 props 发生变化时才会重新渲染。通过使用 useCallback,我们确保 handleClick 在渲染之间保持相同的引用(除非计数发生变化),从而防止 ChildComponent 不必要的重新渲染。
使用 useMemo 的示例:
import React, { useState, useMemo } from 'react'; const ExpensiveComponent = ({ list }) => { const sortedList = useMemo(() => { console.log('Sorting list'); return [...list].sort((a, b) => a - b); }, [list]); return ( <div> <h2>Sorted List:</h2> {sortedList.map(item => <div key={item}>{item}</div>)} </div> ); }; const ParentComponent = () => { const [list] = useState([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]); const [count, setCount] = useState(0); return ( <div> <ExpensiveComponent list={list} /> <button onClick={() => setCount(count + 1)}> Clicked {count} times </button> </div> ); };
在此示例中,useMemo 用于记忆排序列表。昂贵的排序操作只会在 list prop 更改时执行,而不是在 ExpenseComponent 的每次渲染上执行。这在这里特别有用,因为 ParentComponent 可能会因与列表无关的原因重新渲染(例如当计数更改时),并且我们不想不必要地重新排序列表。
要点:
关注更多类似内容!
以上是React:useCallback 与 useMemo的详细内容。更多信息请关注PHP中文网其他相关文章!