react中的Hook函数的useCallback和useMemo作用,语法,使用

hook函数的优点,useEffect函数:https://blog.csdn.net/kkkys_kkk/article/details/134878097?spm=1001.2014.3001.5501

目录

useCallback

作用

语法

使用

useMemo

作用

语法

使用


 useCallback 和 useMemo 都是 React 中的 Hook,都可以优化组件的性能。

useCallback

作用

useCallback 用于缓存一个函数,避免在每次渲染时都重新创建函数实例。这对于需要将回调函数传递到子组件的场景是很有用的。当子组件需要 memoization 时,使用 useCallback 可以确保在依赖项相同的情况下返回相同的函数引用。

语法

与普通的函数定义不同,使用 useCallback 创建的函数可以被缓存,以免在每次执行时都重新创建新的函数。当组件的 props 或 state 发生变化时,使用 useCallback 缓存的函数会返回之前的引用,从而避免不必要的重复渲染。

const myCallback = useCallback(
    () => {
       函数处理(a)
      },
     [a] // 依赖项
)

useCallback 接受两个参数:

  • 第一个参数是一个回调函数,即需要缓存的函数;
  • 第二个参数是一个依赖数组,表示什么情况下需要重新创建新的函数。
使用

依赖项是count,所以只有count改变后,这个函数才会重新声明一次

如果传入空数组,那么就是第一次创建后就被缓存,即使后期count改变,我们得到的还是之前的count值

如果不传入第二个参数,,每次都会重新声明一次,拿到的就是最新的count值

import React, { useState, useCallback } from 'react';
import Button from './Button';

function App() {
  const [count, setCount] = useState(0);
  
  // 将回调函数缓存起来
  const handleClick = useCallback(() => {
    setCount(count + 1);
  }, [count]);
  
  return (
    <>
      <h1>Count: {count}</h1>
      <Button onClick={handleClick}>click me</Button>
    </>
  );
}

需要注意的是,useCallback 只有在组件的性能出现问题时,才需要使用。不是所有的函数都需要被缓存,因此应该具体问题具体分析,避免过度优化。此外,在依赖数组中传入不必要的值,可能会导致不必要的缓存和重复渲染,因此应该谨慎传入依赖数组。

useMemo

作用

useMemo 的作用是对一个函数的返回值进行缓存,只在依赖项变化时才重新计算。它可以帮助优化性能,避免不必要的计算开销。

与 useCallback 不同,useMemo 是用于缓存值的,而不是函数。

useCallback 不会执行第一个参数函数,而是将它返回给你,而 useMemo 会执行第一个函数
并且将函数执行结果返回给你
语法
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])

同样的,useMemo也有两个参数

  • 第一个参数是一个回调函数,即需要缓存的计算函数;
  • 第二个参数是一个依赖数组,表示什么情况下需要重新计算结果。
使用

在 useState 中定义一个状态变量 str,并将其默认值设置为 'hello world'

分别渲染str 和经过反转后的 reverseStr。由于 reverseStr 的计算依赖于 str 的值,因此这里使用了 useMemo

组件中渲染了一个按钮,用于修改 str 状态值。当点击按钮时,str 的值就会变成 'hello',这时候组件会重新渲染,并重新计算 reverseStr 的值

由于 reverseStr 使用了 useMemo 进行了优化,只有 str 的值发生变化时才会重新计算,从而避免了不必要的计算和渲染,提高了组件的性能。

import { useMemo, useState } from "react"
export default function App() {
   let [str, setStr] = useState('hello world')
   // 将str的值进行反转
   const reverseStr = useMemo(() => str.split('').reverse().join(''), [str])
   return (
     <div id="root" className="app-root">
      <div>{ str }</div>
      <div>{ reverseStr }</div>
      <button onClick={ () => setStr('hello') }>点击我</button>
    </div>
   )
}

需要注意的是,useMemo 可以用于缓存计算结果,但是不适合用于缓存组件。如果需要缓存整个组件,应该使用 React.memo。同时,应该注意在不必要的情况下,避免过度依赖数据,从而降低使用 useMemo 的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值