最简洁的答案是不。
两者都用于优化性能以减少不必要的重新渲染,但React.memo
用于useMemo
两种不同的场景......
React.memo是一个 HOOC,它通知 react 对传入的 props 进行浅层比较,以确定是否重新渲染。
https://reactjs.org/docs/react-api.html#reactmemo
例子:
export const Component = React.memo(({name}) => `Hello ${name}`)
在这里,react will 进行浅比较,并且仅在名称更改时才会重新渲染。
useMemo是一个钩子,用于记忆一个值。useMemo
只有在依赖项(的第二个参数)发生变化时,React 才会重新评估该值。应该遵循带有钩子的使用规则。
https://reactjs.org/docs/hooks-reference.html#usememo
例子:
export const MyComponent = ({firstName, lastName, age}) => {
const fullName = useMemo(() => `${firstName} ${lastName}`, [firstName, lastName]);
return <Profile fullName={fullName} />
}
你可以破解 useMemo 来做类似 React.memo 的事情,但它不打算以这种方式使用。
useCallback还有一个useCallback
经常和 . 一起使用的钩子React.memo
。
如果您的父组件将回调传递给包含在 中的子组件React.memo
,则最好使用创建回调,useCallback
否则子组件将重新渲染,因为每次父组件重新渲染时都会重新创建回调。
useCallback
还需要一个依赖数组,useMemo
以便在依赖项更改时可以重新创建它。
https://reactjs.org/docs/hooks-reference.html#usecallback
例子:
export const MyComponent = ({firstName, lastName, age}) => {
const handleClick = useCallback((e) => {
e.preventDefault();
// doSomething
}, []);
return <Profile onClick={handleClick} />
}
const Profile = React.memo((onClick) => (
<button onClick={onClick)>Click me!</button>
));