:::info 原理:对函数的返回值进行相应的缓存,提升React的计算性能。
- useCallback是对传入的回调函数(返回一个有记忆的函数)进行性能优化。
- useMemo是对传入函数的返回值进行相应的性能优化。 :::
1、计算求和
import React, { useState } from 'react'// 计算从0到传入数字的总和function calcNumber(number) {let total = 0;for(let i = 0; i <= number; i++) {console.log(i)total += i}return total}export default function useMemoDemo() {// 定义状态const [count, setCount] = useState(10)const [show, setShow] = useState(true)// 循环进行计算 这样使用的话 当我们的组件中的状态发生变化的时候 组件中所有的数据都需要进行重新的计算 消耗性能let total = calcNumber(count)return (<div><h2>总和: { total }</h2><button onClick={ () => setCount(count + 1)}>+1</button><button onClick={ () => setShow(!show)}>切换</button></div>)}
2、计算求和进行性能优化
import React, { useState, useMemo } from 'react'// 计算从0到传入数字的总和function calcNumber(number) {let total = 0;for(let i = 0; i <= number; i++) {console.log(i)total += i}return total}export default function useMemoDemo() {// 定义状态const [count, setCount] = useState(10)const [show, setShow] = useState(true)// 循环进行计算 这样使用的话 当我们的组件中的状态发生变化的时候 组件中所有的数据都需要进行重新的计算 消耗性能// let total = calcNumber(count)const total = useMemo(() => {return calcNumber(count)// 传入需要依赖的组件的内部状态 如果组件的内部状态发生改变 则调用函数// 如果组件内部的状态不再发生改变 则这个hook函数不会进行调用}, [count])return (<div><h2>总和: { total }</h2><button onClick={ () => setCount(count + 1)}>+1</button><button onClick={ () => setShow(!show)}>切换</button></div>)}
3、useMemo传入子组件应用类型
当存在子组件的时候,子组件是否重新进行渲染,取决于组件的状态是否发生了变化,如果组件的状态发生了变化,那么子组件就会重新进行渲染,如果没有发生变化,则不会进行相应的数据的渲染。
import React, { memo, useMemo, useState } from 'react'// 定义子组件const HYInfo = memo((props) => {console.log('子组件重新渲染了');return (<><h2>{ props.info.name }</h2><h2>{ props.info.age }</h2></>)})export default function UseMemoHookDemo() {console.log('父组件渲染了');// 定义状态const [show, setShow] = useState(true)// 定义局部的一个变量// const info = { name: 'coderweiwei', age: 14 }// 使用useMeno进行相应的优化const info = useMemo(() => {return { name: 'coderweiwei', age: 18 }}, [])return (<div><HYInfo info={info} /><button onClick={ e => setShow(!show)}>父组件改变状态</button></div>)}
