首页 > 其他分享 >useMemo和useCallback

useMemo和useCallback

时间:2024-03-31 16:33:46浏览次数:16  
标签:count 渲染 useMemo ParentComponent useCallback handleIncrement

useMemo 和 useCallback 是 React 的两个高级 Hooks,分别用于优化渲染性能和避免不必要的重新渲染,和vue中的计算属性computed相似(缓存)

1.useMemo

useMemo 用于避免在每次渲染时都执行高开销的计算。它会返回一个 memoized(缓存)的值,这个值仅在其依赖项发生变化时才会重新计算。

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

function App() {

  const [x, setx] = useState(0)

  const [y, sety] = useState(0)

  console.time("xxx")

  const computedValue = useMemo(() => {

    let a = 0;

    for (let i = 0; i < 1000000000; i++) {

      a += y

    }

    return a

  }, [y])

  console.timeEnd("xxx")

  console.log(computedValue)

  return (

    <div>

      <div>   x:{x};;;;y{y}</div>

      <div>

        <button onClick={() => setx(x + 1)}>xxx</button>

        <button onClick={() => sety(y + 1)}>yyy</button>

      </div>

    </div>

  )

}

export default App

当y发生变化时computedValue会重新计算,x变化时候由于computedValue没有依赖x,所以不会重新计算

2.useCallback

useCallback 用于返回一个记忆化的回调函数。只有当其依赖项发生变化时,该函数才会更新。这有助于避免在每次渲染时都创建新的函数实例,从而提高性能并减少不必要的重新渲染。

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

function ParentComponent() {

const [count, setCount] = useState(0);

// 使用 useCallback 来记忆化这个回调函数

// 注意这里我们没有将 count 作为依赖项,因此 handleIncrement 不会随着 count 的变化而变化 const handleIncrement = useCallback(() => {

setCount(count => count + 1);

}, []);

// 空数组意味着 handleIncrement 不会基于任何 props 或 state 的变化而重新创建

return (

<div> <p>Count: {count}</p>

<ChildComponent onIncrement={handleIncrement} />

<button onClick={handleIncrement}>Increment</button>

</div>

);

}

function ChildComponent({ onIncrement }) {

// ChildComponent 可能会基于 onIncrement 的引用是否改变来决定是否重新渲染

// 使用 useCallback 可以确保即使 ParentComponent 重新渲染,onIncrement 的引用也不会改变(除非我们显式地将它作为依赖项)

return (

<div> <button onClick={onIncrement}>Increment from Child</button> </div> );

}

export default ParentComponent;

ParentComponent 有一个状态 count 和一个用于增加 count 的回调函数 handleIncrementhandleIncrement 是通过 useCallback 创建的,并且没有依赖任何变量(依赖项数组是空的 [])。这意味着,无论 ParentComponent 渲染多少次,handleIncrement 的引用都将保持不变。

ChildComponent 接收 onIncrement 作为 prop,并可能基于这个 prop 的引用是否变化来决定是否重新渲染。因为 handleIncrement 是通过 useCallback 创建的,并且没有依赖任何变量,所以即使 ParentComponent 重新渲染,ChildComponent 接收到的 onIncrement 引用也会保持不变,这有助于避免不必要的渲染。

标签:count,渲染,useMemo,ParentComponent,useCallback,handleIncrement
From: https://blog.csdn.net/qq_68937887/article/details/137201041

相关文章

  • useMemo
    useMemo我们应该如何去正确理解useMemo呢functionfib(n){console.info('计算函数被执行1')returnn<3?1:fib(n-2)+fib(n-1)}functionApp(){const[count1,setCount1]=useState(0)const[count2,setCount2]=useState(0)console......
  • 使用useCallback包裹后,参数类型就变成了any
    在使用React的useCallbackHook时,如果直接包裹一个函数而没有提供类型参数,TypeScript会默认认为回调函数的参数类型为any。这是因为useCallbackHook接受两个参数,第一个是回调函数,第二个是一个依赖数组,而TypeScript在没有明确指定类型的情况下无法推断回调函数的参数类型。要解决......
  • react-native中memo、useMemo、useCallback 你真的用明白了吗
    memo的作用在React的渲染流程中,一般来说,父组件的某个状态发生改变,那么父组件会重新渲染,父组件所使用的所有子组件,都会强制渲染。而在某些场景中,子组件并没有使用父组件传入的没有发生更改的状态时,子组件重新渲染是没有必要的。因此有了React.memomemo的使用memo是个高阶......
  • react_hooks系列 useMemo
    一、概念和作用​写在函数式组件里的“函数调用代码”。如果函数式组件重新渲染时,每次都会执行“调用函数的代码”。如果不是必须的,那么就是性能的浪费。useMemo就是解决这个问题的。即:useMemo是防止不必要的的函数调用。​文字描述总是让你很难理解。很抽象。还是要看代码的......
  • react_hooks系列 useCallback,高阶函数memo
    react_hooks的useCallback,高阶函数memo一、概念和作用1、memo高阶函数:memo解决的是函数式组件的无效渲染问题,当函数式组件重新渲染时,会先判断数据是否发生了变化。相当于类组件的PureComponent(默认提供ShouldComponentUpdate)2、useCallback:1)、useCallback会返回一个函数的memoiz......
  • useMemo依赖没变,回调还会反复执行?
    经常使用React都知道,有些hook被设计为:依赖项数组+回调的形式,比如:useEffectuseMemo通常来说,当依赖项数组中某些值变化后,回调会重新执行。React的写法十分灵活,那么有没有可能,在依赖项数组不变的情况下,回调依然重新执行?描述下Demo在这个示例中,存在两个文件:App.tsxLazy.......
  • React面试题: useCallBack()与React.memo的区别与使用常见场景
    React.usecallback与React.memo的区别:React.useCallback和React.memo是两种不同的优化方式:主要功能:它们都可以避免不必要的渲染,提高React应用的性能。React.useCallback是Hoc(高阶组件)的解决方案,可以用于优化函数组件和Class组件,注意这里适用于React高阶组件的渲染解......
  • 【React】React.memo与useMemo的区别和联系
    概述React.memo和useMemo都是React进行性能优化的手段,它们允许我们缓存需要进行高性能计算的结果,以便下次渲染页面时,返回缓存的值而不必重新计算函数,从而确保我们的应用程序运行的更快,避免不必要的开销。React.memo详解为什么memo(memoization的简写)在React中这么重要呢?在......
  • 【React系列】React.memo() vs useMemo()
    React.memo()与useMemo()之间有什么主要区别?性能优化是一只web开发中的一个重要讨论点。对于react团队同样如此,为了实现加速组件的渲染速度,采用“备忘录”的方式。所以这个时候就React.memo()和useMemo钩子就为了解决这个问题产生了。本文将比较和对比React.memo和useMem......
  • useMemo的用法
    类似于计算属性,当响应式依赖项变化时,计算新的cache值,如下:constcachedValue=useMemo(calculateValue,dependencies)import{useMemo}from'react'; functionTodoList({todos,tab}){constvisibleTodos=useMemo(()=>filterTodos(todos,tab),[todos,tab]......