react缓存【类组件shouldComponentUpdate/PureComponent】【子组件React.memo】【函数组件useMemo值、useCallback函数】

本文介绍了React中的shouldComponentUpdate生命周期函数的用法,以及如何通过React.memo和useMemo进行组件优化,强调了浅比较在缓存和响应式数据中的应用,以提高性能。
摘要由CSDN通过智能技术生成

目录

类组件

生命周期函数shouldComponentUpdate ​​(nextProps, nextState)=>{return bool}​​​​

extends PureComponent,自动shouldComponentUpdate

函数组件

React.memo(函数组件(props))

钩子:useMemo、useCallback

限制:浅比较

Object.is(val0, val1):NaN等,±0不等

useMemo(calculateValue, dependencies):记忆值

应用:慢的1ms+,计算时间复杂度T(1000+)

 time/timeEnd:计算时间

参数说明

calculateValue:要缓存计算值的函数

fn:想要缓存的函数

useCallback(fn, dependencies):记忆函数

memo和callback类似call和bind:返回函数但不调用


类组件

生命周期函数shouldComponentUpdate ​​(nextProps, nextState)=>{return bool}​​​​

shouldComponentUpdate = (nextProps, nextState) => {
        if(this.state.msg === nextState.msg){
            return false;
        }
        else{
            return true;//重新渲染
        }
    }

extends PureComponent,自动shouldComponentUpdate

React.PureComponentReact.Component 的一个子类

函数组件

React.memo(函数组件(props))

高阶组件

当父组件的 props 没有发生变化时,React.memo 会使用之前渲染的结果,从而避免重新渲染。

let Welcome = (props) => {  
    const [ count, setCount ] = useState(0);
    const handleClick= () => {
        setCount(count+1);
    }
    const foo = () => {}
    return (
        <div>
            <button onClick={handleClick}>点击</button>
            hello Welcome
            <Head onClick={foo} />
        </div>
    );
}
let Head = React.memo(() => {
    return (
        <div>hello Head, { Math.random() }</div>
    )
})

钩子:useMemouseCallback

限制:浅比较

Object.is(val0, val1):NaN等,±0不等

react中的比较,无论是缓存,还是响应式数据,都是用的浅比较(引用对象比较地址值

要想比较对象,需要复制之前的对象值并新建

{
        ...state,
        age: state.age + 1
}

useMemo(calculateValue, dependencies):记忆值

缓存返回值的方式也叫做 记忆化(memoization)

应用:慢的1ms+,计算时间复杂度T(1000+)

 time/timeEnd:计算时间

console.time('filter array');
const visibleTodos = filterTodos(todos, tab);
console.timeEnd('filter array');

参数说明

calculateValue:要缓存计算值的函数

fn:想要缓存的函数

没有参数的纯函数,返回任意类型

React 将会在首次渲染时调用该函数;

在之后的渲染中,如果 dependencies 没有发生变化,React 将直接返回相同值。

否则,将会再次调用 calculateValue 并返回最新结果,然后缓存该结果以便下次重复使用。

useCallback(fn, dependencies):记忆函数

memo和callback类似call和bind:返回函数但不调用

function ProductPage({ productId, referrer, theme }) {
  // 在多次渲染中缓存函数
  const handleSubmit = useCallback((orderDetails) => {
    post('/product/' + productId + '/buy', {
      referrer,
      orderDetails,
    });
  }, [productId, referrer]); // 只要这些依赖没有改变

  return (
    <div className={theme}>
      {/* ShippingForm 就会收到同样的 props 并且跳过重新渲染 */}
      <ShippingForm onSubmit={handleSubmit} />
    </div>
  );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值