React.memo; react.memo 与useMemo区别

React.memo

React.memo介绍

  • React.memo()是一个高阶组件
  • 如果你的组件在相同 props 的情况下渲染相同的结果,那么你可以通过将其包装在 React.memo 中调用,以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下,React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。
  • React.memo 仅检查 props 变更。如果函数组件被 React.memo 包裹,且其实现中拥有 useState,useReducer 或 useContext 的 Hook,当 state 或 context 发生变化时,它仍会重新渲染。
  • 默认情况下其只会对复杂对象做浅层对比,如果你想要控制对比过程,那么请将自定义的比较函数通过第二个参数传入来实现。
  • 用于性能优化,但请不要依赖它来“阻止”渲染,因为这会产生 bug。
  • 只能在函数式组件中使用;类似于类组件中的(PureCompoment,shouldComponentupdate)
  • react.memo中文文档

React.memo简单理解

  • 高阶组件;用于性能优化;函数式组件中使用;通过比较props,如果props有变化则重新渲染组件,没有变化则不执行js不渲染,目的是为了阻止子组件被动渲染。

React.memo用法

  • React.memo()可接受2个参数;
  • 第一个参数是性能优化的目标组件;
  • 第二个参数是比较函数,与shouldComponentUpdate()功能类似;
const ChildComponent = (props) =>{
  /* render using props */
}
const areEqual = (preProps,nextProps) => {
  /*如果把 nextProps 传入 render 方法的返回结果与
  将 prevProps 传入 render 方法的返回结果一致则返回 true,
  否则返回 false */
}
export default React.memo(ChildComponent,areEqual)

React.memo使用例子

  • 比如:现有一个组件,每一秒都会重新渲染一次,对于子组件而言肯定不希望也跟着渲染,就需要用到React.memo(或PureComponent)。
import React,{useState}  from 'react';
//父组件
const FathComponent = () => {
  
  const [count, setCount] = useState(1);
  
  const onCount = () => {
    setCount(2)
  }
  
    return (
          <div>
              <Child seconds={1}/>
              <button onClick={onCount}>count</button>
          </div>
      )
}
export default FathComponent

//子组件
const Child = (props) => {
   console.log('I am rendering');
    return (
        <div> update every {props.seconds} seconds</div>
    )
}
export default Child
  • 以上代码,点击按钮时子组件也会跟着执行打印;react中虽然子组件没有重新渲染DOM节点,但是会执行js代码;实际上我们只是触发了父组件的按钮,并不想让子组件执行,这时候就可以用到React.memo(或PureComponent)
//子组件
const Child = (props) => {
   console.log('I am rendering');
    return (
        <div> update every {props.seconds} seconds</div>
    )
}

export default React.memo(Child)
  • 给子组件用React.memo包裹起来后,这样点击父组件按钮时就子组件就不会打印
//子组件
const Child = (props) => {
   console.log('I am rendering');
    return (
        <div> update every {props.seconds} seconds</div>
    )
}

const areEqua = (prevProps, nextProps) => {
   if(prevProps.seconds===nextProps.seconds){
        return true
    }else {
        return false
    }
}
export default React.memo(Child,areEqua)
  • React.memo()可接受2个参数;第二个参数返回false,子组件才需要渲染;

react.memo 与useMemo区别

  • react.memo 是 高阶组件;useMemo 是 hooks;
  • react.memo 是 子组件本身是否渲染,可以进行粗粒度的性能优化;useMemo 是 一段函数逻辑是否重复执行,可以进行更加细粒度的性能优化;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: useMemoReact.memo都是React中的性能优化工具,但是它们的作用不同。 useMemo是一个hook函数,它用于缓存计算结果,避免重复计算。当组件重新渲染时,useMemo会检查依赖项是否发生了变化,如果依赖项没有变化,就会返回缓存的结果,避免重复计算。useMemo适用于需要进行复杂计算的场景,比如计算数组的平均值、过滤数组等。 React.memo是一个高阶组件,它用于优化组件的渲染性能。React.memo会对组件进行浅比较,如果组件的props没有发生变化,就会使用缓存的结果,避免重新渲染组件。React.memo适用于纯展示组件,比如按钮、列表项等。 因此,useMemoReact.memo的作用不同,需要根据具体的场景选择使用。 ### 回答2: useMemoReact.memoReact中两个不同的优化工具,它们的主要目的是优化组件的性能。 useMemoReact中提供的一个钩子函数,它能够在组件渲染过程中,根据依赖值的变化,缓存计算结果,并且在下一次渲染时,只有当依赖值发生改变时,才会重新计算。这样能够避免在每次渲染时都进行计算,从而提高组件的性能。 React.memo则是一个高阶组件,通过对组件的渲染结果进行浅比较,来判断是否需要重新渲染组件。如果渲染结果相同,则不会触发重新渲染。这样能够避免无意义的渲染,从而提高组件的性能。 两者的使用场景不同。useMemo更适用于一些耗时的计算或者重复性的计算,如一些复杂的数学计算或者列表数据的筛选排序等。而React.memo则更适用于纯展示性质的组件,如展示用户信息、文章列表等。 需要注意的是,两者的作用是不同的。useMemo主要是对计算结果进行缓存,而React.memo主要是对组件的渲染结果进行缓存。因此在使用时需要根据不同的需求进行选择和使用。同时,对于一些小型的组件或者不需要进行过多性能优化的组件,可以不需要使用这些工具,以保持代码的简洁性。 ### 回答3: React Hook中的useMemoReact.memo是两个非常常见的React优化技术。使用这两个技术可以优化React应用程序的性能,减少不必要的重新渲染,提高用户体验。虽然它们都可以优化组件的性能,但它们具有不同的作用和实现方式。 useMemoReact Hook提供的一个函数,它主要用于缓存计算结果。它接受两个参数:第一个参数是一个函数,它执行计算操作并返回结果;第二个参数是一个数组,包含所有影响计算结果的变量。当第二个参数中的变量发生变化时,useMemo函数会重新执行计算操作并返回新的结果。反之,如果第二个参数中的变量不发生变化,useMemo函数会返回缓存的结果,避免不必要的计算。从实现方式上来看,useMemo是在组件内部使用的,它可以帮助我们避免重复计算相同结果的情况,从而减少组件的渲染次数。 React.memo是用于React函数组件的高阶组件。它接受一个组件作为参数,并返回一个新的组件。新的组件将具有与原始组件相同的功能,但会根据输入属性进行优化。React.memo会对输入属性进行浅层比较,如果所有输入属性都相等,React.memo会实现组件的缓存机制,避免不必要的渲染。如果输入属性与上一次比较不同,那么React.memo就会重新渲染组件。从实现方式上看,React.memo是在组件外部使用的,它可以帮助我们避免重复渲染相同的组件。 总结:useMemoReact.memo都是用于优化React应用程序性能的技术,但它们的作用和实现方式有所不同。useMemo用于缓存计算结果,减少不必要的计算;React.memo用于缓存组件渲染结果,避免不必要的组件渲染。使用这两种技术可以更好地管理React组件的性能,提高应用程序的响应速度和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值