5 useMemo&&useCallback

useMemo

  • 优化渲染

现象

  • App每次重新执行时,render变化了,引用的render不是同一个函数
import React, { useState, } from "react";
const Foo = props => {
    return <ul>{props.render()}</ul>
}
function App() {
    const [range, setRange] = useState({ min: 0, max: 10 })
    const [count, setCount] = useState(0)
    const render = () => {
        let list = []
        for (var i = 0; i < range.max; i++) {
            list.push(<li key={i}>{i}</li>)
        }
        console.log('每次点击,App重新渲染,该render函数也会执行')
        return list
    }
    return (
        <>

            {count}<button onClick={() => setCount(count + 1)}>add</button>
            <br />
            <Foo render={render} />
        </>
    )
}
export default App

在这里插入图片描述

类组件pureComponent

  • 属性不变,子组件不重新渲染(只会在初次渲染时执行一次)
class Foo extends PureComponent {
    render() {
        console.log('PureComponent')
        return (
            <>
                <p>{this.props.count}</p>
            </>
        )
    }
}
<Foo count={1} />

在这里插入图片描述

函数组件memo

const Foo = memo(props => {
    console.log('memo')
    return (
        <p>{props.count}</p>
    )
})

useCallback

  • 固定的是函数
const render = useCallback(() => {
    let list = []
    for (var i = 0; i < range.max; i++) {
        list.push(<li key={i}>{i}</li>)
    }
    return list
}, [range])
// 第二个参数表依赖项,依赖变化了才会重新渲染
const Foo = memo(props => {
    console.log('useCallback')
    return (
        <>
            <p>{props.count}</p>
            <ul>{props.render()}</ul>
        </>
    )
})

useMemo

  • 固定的是值,会将函数执行
const render = useMemo(() => {
    let list = []
    for (var i = 0; i < range.max; i++) {
        list.push(<li key={i}>{i}</li>)
    }
    return list
}, [range])
// 注意:子组件的render函数不需要执行
const Foo = memo(props => {
    console.log('useCallback')
    return (
        <>
            <p>{props.count}</p>
            <ul>{props.render}</ul> 
        </>
    )
})

改变range,依赖变化

<button
onClick={() => setRange({
    ...range,
    max: range.max + 1
})}>add</button>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值