React Hooks(useCallback、useMemo、useRef)

本文详细介绍了React Hooks中的useCallback、useMemo和useRef,通过实例展示了它们在优化组件性能和保存状态方面的应用。useCallback用于记忆函数,避免不必要的重新创建;useMemo用于记忆组件,提高渲染效率;useRef则用于保存引用值,尤其在处理DOM元素或维持状态时非常有用。
摘要由CSDN通过智能技术生成

一、useCallback(记忆函数)

防止因为组件重新渲染,导致方法被重新创建,起到缓存作用,只有第二个参数变化了,才重新声明一次。

新建 UseCallback.js方法组件,写入代码:

import React, { useCallback, useState } from 'react'

export default function UseCallback() {

  const [count, setCount] = useState(0)

  const addHandle = useCallback(
    () => {
        setCount(count+1)
    },
    [count]
  )
    
  return (
    <div>
        <button onClick={addHandle}>click</button>
        {count}
    </div>
  )
}

效果:
在这里插入图片描述
可以看到我们使用了useCallback将函数给记忆起来了,为了使其他状态改变而不重新创建不该创建的函数,只有当依赖项count发生改变时才会重新创建。从一定意义上来说提高了性能。


二、useMemo(记忆组件)

useCallback的功能完全可以由useMemo所取代,如果你想通过使用useMemo返回一个记忆函数也是完全可以的。

我们将之前案例选项卡的子组件Cinema.js类组件改成函数组件,并且使用useMemo

import React, { useEffect, useMemo, useState } from 'react'
import axios from 'axios'


export default function UseCallback() {

  const [cinemaList, setCinemaList] = useState([])
  const [text, setText] = useState('')

  useEffect(() => {
    axios({
        url: 'https://m.maizuo.com/gateway?cityId=110100&ticketFlag=1&k=3085018',
        method: 'get',
        headers: {
            'X-Client-Info':' {"a":"3000","ch":"1002","v":"5.2.0","e":"1646314068530784943341569"}',
            'X-Host': 'mall.film-ticket.cinema.list'
        }
    }).then((res) => {
        console.log(res.data)
        setCinemaList(res.data.data.cinemas)
    }).catch((err) => {
        console.log(err)
    })
  },[])

  const getCinemaList = useMemo(() => cinemaList.filter(item => item.name.toUpperCase().includes(text.toUpperCase()) || 
  item.address.toUpperCase().includes(text.toUpperCase())), [cinemaList, text]) // useMemo会执行函数并返回执行后的结果
    
  return (
    <div>
        <input value={text} onChange={(event) => {
              setText(event.target.value)
            }}></input>
            {
                getCinemaList.map((item) => 
                <dl key={item.cinemaId}>
                    <dt>{item.name}</dt>
                    <dd>{item.address}</dd>
                </dl>
                )
            }
    </div>
  )
}

效果:
在这里插入图片描述
可以看到我们使用了函数式组件的hooks成功将之前类组件给重构出来了,并且也是相当的方便。


三、useRef(保存引用值)

新建useRef.js组件,写入代码:

import React, { useRef, useState } from 'react'

export default function UseRef() {

    // let [name, setName] = useState('')
    const name = useRef()
    let [list, setList] = useState(['000', '111', '222'])

    let btnHandle = () => {
        let newList = [...list]
        setList([...newList, name.current.value])
        name.current.value = ''
    }

    let delHandle = (key) => {
        let temList = [...list]
        temList.splice(key, 1)
        setList(temList)
    }

    return (
        <div>
            <input ref={name}></input>
            <button onClick={btnHandle}>click</button>
            <ul>
                {list.map((value, key) => {
                    return <li key={key}>{value} <button onClick={(key) => delHandle(key)}>删除</button></li>
                })}
            </ul>
        </div>
    )
}

效果:
在这里插入图片描述
不仅如此,useRef还能在函数组件中保持状态:

import React, { useState, useRef } from 'react'

export default function UseRef() {

    const [count, setCount] = useState(0)

    let myCount = useRef(0)

    const addHandle = () => {
        setCount(count + 1)
        myCount.current++
    }

    return (
        <div>
            <button onClick={addHandle}>click</button>
            {count} - {myCount.current}
        </div>
    )
}

在这里插入图片描述

在学习React的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用React Hooks中的useCallback函数时要避免滥用。useCallback函数的作用是为了优化性能,它可以确保当依赖项没有变化时,回调函数不会被重新创建。这在某些情况下是非常有用的,比如在父组件中传递回调函数给子组件时,可以避免子组件的不必要渲染。 然而,滥用useCallback函数可能会导致性能下降。当依赖项数组为空时,useCallback函数将会在每次渲染时都返回一个新的回调函数,这可能会导致子组件的不必要渲染。因此,应该谨慎使用useCallback函数,并确保只在必要时才使用。 另外,需要注意的是,被useCallback包裹的函数也会被重新构建并当作useCallback函数的实参传入。这意味着,如果传入的函数依赖于外部的变量,那么每次渲染时,都会创建一个新的函数实例,这可能会导致不必要的性能开销。因此,在使用useCallback函数时,应该仔细考虑函数的依赖关系,避免不必要的重新创建。 综上所述,滥用useCallback函数可能会导致性能下降,因此在使用时需要谨慎考虑,并确保只在必要时使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [React-HOOK——useRefuseCallbackuseMemouseContext、useReducer](https://blog.csdn.net/qq_52301431/article/details/127302213)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [React Hooks 实现撤消和重做功能](https://download.csdn.net/download/weixin_42099815/19472723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [React hooks之useCallback的使用场景及其深度解读](https://blog.csdn.net/hyupeng1006/article/details/127754586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值