:::info 原理:对函数的返回值进行相应的缓存,提升React的计算性能。

  • useCallback是对传入的回调函数(返回一个有记忆的函数)进行性能优化。
  • useMemo是对传入函数的返回值进行相应的性能优化。 :::

1、计算求和

  1. import React, { useState } from 'react'
  2. // 计算从0到传入数字的总和
  3. function calcNumber(number) {
  4. let total = 0;
  5. for(let i = 0; i <= number; i++) {
  6. console.log(i)
  7. total += i
  8. }
  9. return total
  10. }
  11. export default function useMemoDemo() {
  12. // 定义状态
  13. const [count, setCount] = useState(10)
  14. const [show, setShow] = useState(true)
  15. // 循环进行计算 这样使用的话 当我们的组件中的状态发生变化的时候 组件中所有的数据都需要进行重新的计算 消耗性能
  16. let total = calcNumber(count)
  17. return (
  18. <div>
  19. <h2>总和: { total }</h2>
  20. <button onClick={ () => setCount(count + 1)}>+1</button>
  21. <button onClick={ () => setShow(!show)}>切换</button>
  22. </div>
  23. )
  24. }

2、计算求和进行性能优化

  1. import React, { useState, useMemo } from 'react'
  2. // 计算从0到传入数字的总和
  3. function calcNumber(number) {
  4. let total = 0;
  5. for(let i = 0; i <= number; i++) {
  6. console.log(i)
  7. total += i
  8. }
  9. return total
  10. }
  11. export default function useMemoDemo() {
  12. // 定义状态
  13. const [count, setCount] = useState(10)
  14. const [show, setShow] = useState(true)
  15. // 循环进行计算 这样使用的话 当我们的组件中的状态发生变化的时候 组件中所有的数据都需要进行重新的计算 消耗性能
  16. // let total = calcNumber(count)
  17. const total = useMemo(() => {
  18. return calcNumber(count)
  19. // 传入需要依赖的组件的内部状态 如果组件的内部状态发生改变 则调用函数
  20. // 如果组件内部的状态不再发生改变 则这个hook函数不会进行调用
  21. }, [count])
  22. return (
  23. <div>
  24. <h2>总和: { total }</h2>
  25. <button onClick={ () => setCount(count + 1)}>+1</button>
  26. <button onClick={ () => setShow(!show)}>切换</button>
  27. </div>
  28. )
  29. }

3、useMemo传入子组件应用类型

当存在子组件的时候,子组件是否重新进行渲染,取决于组件的状态是否发生了变化,如果组件的状态发生了变化,那么子组件就会重新进行渲染,如果没有发生变化,则不会进行相应的数据的渲染。

  1. import React, { memo, useMemo, useState } from 'react'
  2. // 定义子组件
  3. const HYInfo = memo((props) => {
  4. console.log('子组件重新渲染了');
  5. return (
  6. <>
  7. <h2>{ props.info.name }</h2>
  8. <h2>{ props.info.age }</h2>
  9. </>
  10. )
  11. })
  12. export default function UseMemoHookDemo() {
  13. console.log('父组件渲染了');
  14. // 定义状态
  15. const [show, setShow] = useState(true)
  16. // 定义局部的一个变量
  17. // const info = { name: 'coderweiwei', age: 14 }
  18. // 使用useMeno进行相应的优化
  19. const info = useMemo(() => {
  20. return { name: 'coderweiwei', age: 18 }
  21. }, [])
  22. return (
  23. <div>
  24. <HYInfo info={info} />
  25. <button onClick={ e => setShow(!show)}>父组件改变状态</button>
  26. </div>
  27. )
  28. }