首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用useMemo代替React.memo语法问题

使用useMemo代替React.memo语法问题
EN

Stack Overflow用户
提问于 2019-04-02 02:28:42
回答 5查看 21.3K关注 0票数 47

我需要演示如何使用React。我的工作代码如下所示,可以实现我想要的结果:

代码语言:javascript
复制
const SpeakerCardDetail = React.memo(
  ({id,...

我找到了一个链接,它表明我可以更多地使用这样的语法,但我无法准确地理解它。

据我所知:

代码语言:javascript
复制
const SpeakerDetail = React.useMemo(() => {
   ({ id,

但显然不是。我确实明白React.memo解决了这个问题,但我确实需要向useMemo展示实际情况,并且我希望有一种可以使用的替代语法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-04-02 05:03:11

React.memoReact.useMemo根本不等同(不要依赖命名相似性)。这是React.memo 文档的引语

React.memo高阶分量

因此,这是一种特殊的方法,它可以优化组件的呈现,因为它使用相同的属性呈现相同的输出。

另一方面,React.useMemo更通用,返回回传值。更通用。

传递一个“create”函数和一个依赖项数组。useMemo只在依赖项( ab)发生变化时才重新计算回忆录值。

代码语言:javascript
复制
const memoizedValue = useMemo(
  () => computeExpensiveValue(a, b), 
  [a, b]
);

虽然它可以被黑客攻击来代替React.memo,但这并不是它的目的,它会给混乱带来更多的麻烦而不是帮助。useMemo是一个钩子,受某些使用规则约束。

还有这样的警告:

在未来,React可能会选择“忘记”一些以前记忆过的值,并在下一次呈现时重新计算它们,例如释放屏幕外组件的内存。编写代码,使其在没有useMemo的情况下仍然工作--然后添加它以优化性能。

票数 65
EN

Stack Overflow用户

发布于 2020-01-11 23:43:01

虽然memo是一个临时的,而useMemo是一个钩子,但是您可以使用它们来实现相同的结果。

对于上下文,HOC是一种较老的反应模式,多年来一直用于基于类的组件和功能组件。您现在仍然可以使用它(没有反对意见的计划)。

钩子是一个相对较新的概念(大约一年),它增强了功能组件,并在许多情况下大大增强了简化代码。这就是为什么许多开发人员正转向使用钩子。

无论如何,memouseMemo都有两个参数:函数和道具。如果在后续重新呈现时没有任何支持更改,则函数不会再次执行,而是返回前面的结果。这实际上是用纯功能方法取代了shouldComponentUpdate回调。

使用memo,您的代码如下所示:

代码语言:javascript
复制
const SpeakerCardDetail = React.memo(
  (props) => <div>{props.name}</div>
)

使用useMemo,您可以编写:

代码语言:javascript
复制
const SpeakerCardDetail = (props) => useMemo(() => <div>{props.name}</div>)

注意,useMemo在组件函数内部使用,而memo包装该函数。

更传统地说,useMemo可以写成:

代码语言:javascript
复制
function SpeakerCardDetail(props) {
  return useMemo(
    () => <div>{props.name}</div>
  )
}

现在,上面的代码每次都会重新呈现,使得useMemo函数有点无用。为了使它发挥它的魔力,我们需要增加第二个参数。(memo仍然工作,即使没有指定第二个参数,但您可以添加它来自定义它)

第二个参数的格式略有不同。memo需要一个函数来比较以前的道具和当前的道具,就像shouldComponentUpdate对类组件所做的那样。

代码语言:javascript
复制
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需要一个数组作为第二个参数。每当数组中的值发生变化时,将再次执行该函数。

代码语言:javascript
复制
function SpeakerCardDetail(props) {
  return useMemo(
    () => <div>{props.name}</div>
  ,
    [props.name]
  )
}

没有比这更神奇的了。memouseMemo都用来回溯函数的结果,唯一的区别是memo是一个临时的(并且可以用于包装类和函数组件),useMemo是一个钩子(并且只能在功能组件中使用)。

票数 39
EN

Stack Overflow用户

发布于 2020-11-26 12:49:31

React.memo useMemo / TLDR:综述

React.memo是一个高阶组件(简称为自定义组件),它将基于道具记忆一个反应组件。

代码语言:javascript
复制
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是一个function钩子,它将回溯从您提供的函数中返回的值。

代码语言:javascript
复制
export function SomeComponent({ num }) {
  const res = useMemo(() => num * 10, [num])
  return <p>{res}</p>
}

来源

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55466104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档