react前端知识点

react-useMemo/useCallback/memo使用

2020-11-26  本文已影响0人  龙猫六六

react提供useMemo/useCallback/memo方法,提高页面刷新效率。若组件依赖的属性没有发送变化,组件可以不刷新。以下提供两个场景的具体使用

单组件内使用

使用语法

import React, { useMemo } from 'react'
useMemo(() => {}, [] ) 

useMemo

case1 (不设置第二个参数,无优化效果)

import React, {useState, useCallback, useEffect, useMemo, memo} from 'react'
// 函数组件,当前组件中useMemo的使用
function App() {
    const [count, setCount] = useState(0)
    const double = useMemo(()=>{
        console.log('double')
        return count * 2
    })//关注点
    return (
        <div>
            <button onClick={() => {
                setCount(count + 1)
            }}>点击+1
            </button>
            <div>Count is :{count}</div>
            <div>Double is :{double}</div>
        </div>
    )
}

case2 (设置第二个参数为[],首次加载更新)

import React, {useState, useCallback, useEffect, useMemo, memo} from 'react'

// 函数组件,当前组件中useMemo的使用
function App() {
    const [count, setCount] = useState(0)

    const double = useMemo(()=>{
        console.log('double')
        return count * 2
    },[])  //关注点

    return (
        <div>
            <button onClick={() => {
                setCount(count + 1)
            }}>点击+1
            </button>
            <div>Count is :{count}</div>
            <div>Double is :{double}</div>
        </div>
    )
}

case3 (设置第二个参数为[count===2])

import React, {useState, useCallback, useEffect, useMemo, memo} from 'react'

// 函数组件,当前组件中useMemo的使用
function App() {
    const [count, setCount] = useState(0)

    const double = useMemo(()=>{
        console.log('double')
        return count * 2
    },[count===2])  //关注点

    return (
        <div>
            <button onClick={() => {
                setCount(count + 1)
            }}>点击+1
            </button>
            <div>Count is :{count}</div>
            <div>Double is :{double}</div>
        </div>
    )
}

父子组件内使用

目标:

子组件的依赖属性更新,才会重新加载子组件

操作:

子组件没用memo声明

程序响应:

代码如下

function Counter(props) {
    console.log('counter')
    return (
        <div>
            double is : {props.counter}
        </div>
    )
}
function App (){
    const [count, setCount] = useState(0)

    const double = useMemo(()=>{
        return count * 2
    }, [count === 2])

    return (
        <div>
            <button onClick={()=>{setCount(count + 1)}}>点击+1</button>
            <div>count is : {count}</div>
            <Counter counter = {double}></Counter>
        </div>
    )
}

子组件用memo声明

程序响应:

代码如下

const Counter = memo(function Counter(props) {
    console.log('counter')
    return (
        <div>
            double is : {props.counter}
        </div>
    )
})

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

    const double = useMemo(()=>{
        return count * 2
    }, [count === 2])

    return (
        <div>
            <button onClick={()=>{setCount(count + 1)}}>点击+1</button>
            <div>count is : {count}</div>
            <Counter counter = {double}></Counter>
        </div>
    )
}

子组件用部分属性useMemo声明

程序响应:

代码

//函数组件,父组件,子组件
const Counter = memo(function Counter(props) {
    console.log('counter')
    return (
        <div>
            double is : {props.counter}
        </div>
    )
})

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

    const double = useMemo(()=>{
        return count * 2
    }, [count === 2])

    const btnClick = ()=>{
        console.log('click')
    }

    return (
        <div>
            <button onClick={()=>{setCount(count + 1)}}>点击+1</button>
            <div>count is : {count}</div>
            <Counter counter = {double} onClick={btnClick}></Counter>
        </div>
    )
}

子组件用全部属性useMemo/useCallback声明

程序响应:

代码

//函数组件,父组件,子组件
const Counter = memo(function Counter(props) {
    console.log('counter')
    return (
        <div>
            double is : {props.counter}
        </div>
    )
})

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

    const double = useMemo(()=>{
        return count * 2
    }, [count === 2])

    const btnClick = useCallback(()=>{
        console.log('click')
    }, [])

    return (
        <div>
            <button onClick={()=>{setCount(count + 1)}}>点击+1</button>
            <div>count is : {count}</div>
            <Counter counter = {double} onClick={btnClick}></Counter>
        </div>
    )
}
上一篇 下一篇

猜你喜欢

热点阅读