简体   繁体   中英

When to use useMemo and useCallback for performance optimization?

Consider i got such example:

import React, { useMemo, useCallback } from 'react'

const Hello = (props) => {
  const { firstName, lastName } = props
  const fullName = useMemo(() => `${firstName} ${lastName}`, [firstName, lastName])

  const sayHello = useCallback(() => {
    console.log(`Hello, ${fullName}`)
  }, [fullName])

  return (
    // ...
  )
}

export default Hello

Basically i have a component called Hello , and it receives two props firstName and lastName , then i need to calculate fullName based on those two props and has a function sayHello() uses fullName to do something

So my question is: In here is it necessary to use useMemo() and useCallback() for performance optimization? It seems like its kind of overuse of useMemo() and useCallback() for just a little benefit, and i am not sure if this might cause potential side effects?

In that example, different answers for that use of useMemo and that use of useCallback :

  • The useMemo is almost certainly overkill; it's just not that expensive for sayHello to build that string (vs. creating a new function to pass to useMemo on every render).

  • The answer for useCallback depends on how sayHello is used. If sayHello is supplied as a prop to a component that is memoized on that prop (like a PureComponent , something that implements shouldComponentUpdate directly, or the result of wrapping a component with React.memo ), it can be a performance optimization to keep sayHello stable by memoizing it as you've shown so that the component(s) you're passing it to don't have to re-render when it changes. If not, though, it's probably not useful, no.

I agree with Drew Reese : Start simple by just writing your functions, and then apply optimization to code you see performing poorly. (Although there are some situations where you might be proactive based on previous experience — say, passing a callback you could memoize to a couple of hundred pure child components...)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM