详解 useMemo 和 React.memo 的作用

前言

React 中的这两个函数都带有 memo,看着比较相似,但是作用和使用场景却不一致。

memo 的英文含义为备忘录,可以理解为保存,记忆之类,从字面意思可以猜测到它的作用。

可能没有实战的童鞋还容易把这两个搞混,但是这两个函数有着完全不一样的功能,也不需要拿来比较,千万不要搞混了,今天就带大家一起来详细的分析一下这两个函数的作用和使用场景!

useMemo

useMemo 是 React 中用来进行性能优化的钩子函数之一,它的作用是用来缓存计算结果,只有在依赖项发生变化时才重新计算,可以有效减少不必要的计算开销。常见的使用场景是在需要进行大量计算或者复杂逻辑的组件中,通过 useMemo 缓存计算结果,避免不必要的重复计算,可以提高组件的性能。

当点击按钮时,count 会加1,而使用 useMemo 则会监听到依赖项的变化,此时会计算得到doubledCount,熟悉 Vue 的小伙伴应该会知道,和 computed 相似。 

import React, { useState, useMemo } from 'react';

const App = () => {
  const [count, setCount] = useState(0);

  // 通过 useMemo 缓存计算结果
  const doubledCount = useMemo(() => {
    return count * 2;
  }, [count]);


  return (
    <div>
      <h1>useMemo Example</h1>
      <p>Count: {count}</p>
      <p>Doubled Count: {doubledCount}</p>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
    </div>
  );
};

export default App;

React.memo

使用 React的小伙伴都了解,当组件中的 state 数据发生变化时,会重新渲染该组件,如果引入子组件,子组件也会重新渲染,这会造成不必要的开销。React.memo 则是用来解决这个问题的。

作用

React.memo 会浅比较当前组件的 props 与上一次渲染时的 props。如果 props 没有变化,则跳过渲染过程。

在这个案例中,我们有两个点击事件,其中点击 handleChangeCount 会引起 count 的改变,当count 改变时,会引入组件重新渲染,在组件中引入了子组件MyComponent ,默认情况下MyComponent 也会重新渲染。

很明显我们可以发现,MyComponent 里面并没有用到 count,也就是说 MyComponent 组件并不需要重新渲染,MyComponent 只需要在自己依赖的 props 改变时重新渲染,所以我们使用React.memo 进行包裹,包裹之后只会在 props 发生变化时重新渲染 MyComponent组件 。

import React, { useState } from 'react';

// 一个纯函数组件
const MyComponent = React.memo(({ name, age }) => {
  console.log('MyComponent rendered');
  return (
    <div>
      <h2>{name}</h2>
      <p>Age: {age}</p>
    </div>
  );
});

const App = () => {
  const [person, setPerson] = useState({ name: 'John', age: 30 });
  const [count, setCount] = useState(0);

  const handleChangeAge = () => {
    setPerson({ ...person, age: person.age + 1 });
  };

  const handleChangeCount = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <MyComponent name={person.name} age={person.age} />
      <button onClick={handleChangeAge}>Change Age</button>
      <button onClick={handleChangeCount}>Change Count</button>
      <p>Count: {count}</p>
    </div>
  );
};

export default App;

通过使用 React.memo,我们避免了 MyComponent 在不必要的情况下重新渲染,从而提高了性能。

需要注意的是,React.memo 只会对函数组件进行浅层比较。如果 props 是一个引用类型(如对象或数组),即使属性值没有改变,React 也会认为它是一个新的引用,从而导致组件重新渲染。在这种情况下,可以使用 React.memo 的第二个参数来提供一个自定义的比较函数。

通过自定义第二个参数,拿到前一个跟后一个props,从而比较里面的属性值是否发生变化而决定是否重新渲染组件。

import React from 'react';

const Person = React.memo(({ person }) => {
  console.log('Person component rendered');
  return (
    <div>
      <h2>{person.name}</h2>
      <p>Age: {person.age}</p>
    </div>
  );
}, (prevProps, nextProps) => {
  // 自定义比较函数
  const prevPerson = prevProps.person;
  const nextPerson = nextProps.person;

  // 比较 person 对象的属性值
  return (
    prevPerson.name === nextPerson.name &&
    prevPerson.age === nextPerson.age
  );
});

const App = () => {
  const [person, setPerson] = React.useState({ name: 'John', age: 30 });

  const handleChangeAge = () => {
    setPerson({ ...person, age: person.age + 1 });
  };

  return (
    <div>
      <Person person={person} />
      <button onClick={handleChangeAge}>Change Age</button>
    </div>
  );
};

export default App;

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

JacksonChen_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值