我需要演示如何使用React Hooks useMemo。我有如下工作代码可以满足我的要求:
const SpeakerCardDetail = React.memo(
({id,...
我发现一个link表明我可以更像这样使用语法,但是我无法确切地弄清楚。
据我所知:
const SpeakerDetail = React.useMemo(() => {
({ id,
显然不是。我确实知道React.memo可以解决问题,但是我确实需要展示useMemo的使用情况,并希望可以使用其他语法。
答案 0 :(得分:22)
虽然memo
是HOC,而useMemo
是一个钩子,但是您可以使用它们来实现相同的结果。
就上下文而言,HOC是一种较旧的React模式,多年来已与基于类和功能的组件一起使用。您今天仍然可以使用它(没有计划弃用)。
挂钩是一个相对较新的概念(大约一年),它增强了功能组件,在许多情况下,simplifies code大大增加了。这就是为什么许多开发人员正在转向使用钩子的原因。
无论如何,memo
和useMemo
都接受两个参数:函数和道具。如果在随后的重新渲染中所有道具均未更改,则不会再次执行该函数,而是返回先前的结果。实际上,这是用一种纯粹的功能性方法代替了shouldComponentUpdate
回调。
使用memo
,您的代码应如下所示:
const SpeakerCardDetail = React.memo(
(props) => <div>{props.name}</div>
)
使用useMemo
,您将写:
const SpeakerCardDetail = (props) => useMemo(() => <div>{props.name}</div>)
请注意,useMemo
用于组件函数内部,而memo
用于包装函数。
更传统地,useMemo
可以写为:
function SpeakerCardDetail(props) {
return useMemo(
() => <div>{props.name}</div>
)
}
现在,上面的代码每次都会重新渲染,从而使useMemo
函数变得毫无用处。为了使其发挥作用,我们需要添加第二个参数。 (memo
即使不指定第二个参数仍然可以使用,但是您可以添加它以自定义它)
第二个参数的格式略有不同。 memo
需要一个比较先前道具和当前道具的函数,就像shouldComponentUpdate
对类组件所做的一样。
const SpeakerCardDetail = React.memo(
(props) => <div>{props.name}</div>
,
// return true if passing nextProps to render would return the same result as passing prevProps to render, otherwise return false
(prevProps, nextProps) => prevProps.name === nextProps.name
)
另一方面, useMemo
期望将数组作为第二个参数。每当数组中的值更改时,该函数就会再次执行。
function SpeakerCardDetail(props) {
return useMemo(
() => <div>{props.name}</div>
,
[props.name]
)
}
真的没有比这更神奇的了。 memo
和useMemo
均用于记忆函数的结果,唯一的区别是memo
是一个{{的HOC(可用于包装类和函数组件) 1}}是一个钩子(只能在功能组件内部使用)。
答案 1 :(得分:1)
React.memo
和React.useMemo
根本不等效(不要依赖命名相似性)。这是来自React.memo
doc的引用:
React.memo
是higher order component。
因此,这是一个HOC,它可以优化组件的呈现,因为它以相同的属性呈现相同的输出。
另一方面, React.useMemo
更通用,returns a memoized value:
传递“创建”函数和一系列依赖项。
useMemo
将 仅当其中一个依赖项(a
或b
)具有以下项时才重新计算存储的值 改变了。
const memoizedValue = useMemo(
() => computeExpensiveValue(a, b),
[a, b]
);
虽然可以被黑客入侵而不是React.memo
来使用,但这并不是它的目的,它会给混乱带来更多的帮助。 useMemo
是一个钩子,受certain usage rules的约束。
也有此警告:
将来,React可能会选择“忘记”以前记住的一些内容 值并在下一次渲染时重新计算它们,例如为...释放内存 屏幕外组件。编写您的代码,使其仍然可以在没有
useMemo
-然后添加它以优化性能。
答案 2 :(得分:0)
我刚刚整理了一篇有关the differences between React.memo vs useMemo which you can find here的文章
总结一下/ tldr:
React.memo
是一个高阶组件(简称HOC),它将根据道具记忆一个react组件。
export function SomeComponent({ num }) {
return <p>{num * 10}</p>
}
export default React.memo(SomeComponent, function areEqual(
prevProps,
nextProps
) {
if (prevProps.num !== nextProps.num) {
return false
}
return true
})
useMemo
是一个反应挂钩,它将记住从您提供的函数返回的值。
export function SomeComponent({ num }) {
const res = useMemo(() => num * 10, [num])
return <p>{res}</p>
}
来源:https://atomizedobjects.com/blog/react/react-memo-vs-use-memo/