react 进阶hook 之 useMemo hook

简介: memo hooks 这个钩子也是用来做优化性能操作的,大家一定还记得 React.memo() 这个是啥呢,是要给高阶组件,用来给函数组件做性能优化的,作用类似 类组件 的 pureComponent,那么 memo hooks 和 React.memo() 有没有联系呢? 没有,虽然都是为函数组件做性能优化的,但是优化的方向是不一样的(纯组件优化方向详情)。

memo hooks 这个钩子也是用来做优化性能操作的,大家一定还记得 React.memo() 这个是啥呢,是要给高阶组件,用来给函数组件做性能优化的,作用类似 类组件 的 pureComponent,那么 memo hooks 和 React.memo() 有没有联系呢? 没有,虽然都是为函数组件做性能优化的,但是优化的方向是不一样的(纯组件优化方向详情)。


语法


const list = useMemo(() => fn(a, b), [a, b])


  • 参数一fn: 任何稳定的复杂数据,这里指的稳定的是指,数据计算量大的,并且不会实时变化,但是在组件中渲染会被重复渲染的数据。


  • 参数二 deps: 依赖的数据,数据变化后,立即执行函数


  • 返回值: 由里面的函数执行结果的返回值决定


看到这个hooks 是不是感觉和一个 hooks 好像, callback hooks(详情),其实 callback hooks就是 momo hooks 里面的一部分,用来固定函数的引用地址不变的,但是 momo hooks 可以实现callback 的功能,还可以固定其他类型的数据


案例


改造callback hooks 案例


20210408144918377.png


效果可以实现一样的,原来还是一样的,memo hooks 固定了函数的引用地址,useCallback(fn, deps) 相当于 useMemo(() => fn, deps)。


memo hooks 固定其他数据类型的案例


假如我们需要实现一个这样的业务场景,在一个函数组件中,有一个特别大数据的列表,并且当前组件中其他组件可以改变状态值。那么我们可以推断一下预期结果,数据渲染只有在初始化的时候渲染,只要我本身组件数据没有改变,那列表就不应该渲染。


扯远了,回到我们的案例代码如下:


import React, { useCallback, useState } from 'react'
interface IListTempCompP {
  // 值
  value: string,
}
function ListTempComp(prop: IListTempCompP) {
  console.log('ListTempComp 组件渲染了');
  return (
    <>
      <li>列表值:{prop.value}</li>
    </>
  )
}
export default function TestMemoHook() {
  // 手动来创建一个大数据
  const [range, setRange] = useState({ min: 0, max: 10000 });
  const lis = [];
  // 把数据放入数据
  for (let index = range.min; index < range.max; index++) {
    lis.push(
      <ListTempComp key={index} value={index.toString()} />
    )
  }
  // 其他数据
  const [inputVal, setInputVal] = useState(0)
  // 定义change事件,养成习惯,防止其他的组件调用当前组件,导致重复渲染
  const inputHandle = useCallback(
    () => {
      setInputVal(inputVal + 1)
    },
    [inputVal],
  )
  return (
    <div>
      <input type="number" value={inputVal} onChange={ inputHandle } />
      <ul>
        {lis}
      </ul>
    </div>
  )
}


效果


这里的效果大家应该猜到了,就是每一次input 的值发生变化,就会输出 10000 次 ListTempComp 组件渲染了


20210408152430173.gif



从我这里打印的结果来看,每一次都会render是不对的,那么我们就要去优化他


优化方法


20210408152627735.png


结论


这样就不会每一次点击的时候,在去渲染子组件了,从这么hooks 来看,我们知道 callbackHook, memoHook, 都哪来给函数组件做数据稳定的,顺便提一下,为啥函数组件只要内部的任何state 状态变化就会导致整个组件重新渲染?而类组件不会呢?


  • 函数组件我们知道state hook 中只要调用 setData 并且数据变化就会重新渲染该组件,


  • 类组件(纯组件)执行 this.setState({}) 不会导致整个组件销毁到重新生成,是因为类组件中有生命周期,只要没有让组件销毁,那么 this.setState({}) 只会重新执行render 函数,其他的数据都是独立的,而render 函数只是类实例中的一个属性。
相关文章
|
6月前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
154 1
|
6月前
|
缓存 前端开发
React中函数式Hooks之useMemo的使用
React的`useMemo` Hook 用于优化性能,通过记忆返回值避免重复计算。它接收一个函数和一个依赖数组,只有当依赖项改变时,才会重新计算被记忆的值。这可以用于避免在每次渲染时都进行昂贵的计算,或者防止子组件不必要的重新渲染。例如,可以在父组件中使用`useMemo`包裹子组件,以依赖特定的props,从而控制子组件的渲染。
57 1
|
7月前
|
缓存 前端开发 JavaScript
React.memo 与 useMemo 超厉害!深入浅出带你理解记忆化技术,让 React 性能优化更上一层楼!
【8月更文挑战第31天】在React开发中,性能优化至关重要。本文探讨了`React.memo`和`useMemo`两大利器,前者通过避免不必要的组件重渲染提升效率,后者则缓存计算结果,防止重复计算。结合示例代码,文章详细解析了如何运用这两个Hook进行性能优化,并强调了合理选择与谨慎使用的最佳实践,助你轻松掌握高效开发技巧。
166 0
|
7月前
|
前端开发
React 中的 Hook 概念
【8月更文挑战第31天】
70 0
|
8月前
|
前端开发
React useImperativeHandle Hook
【7月更文挑战第1天】React useImperativeHandle Hook
44 3
|
8月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
149 1
|
8月前
|
存储 前端开发 JavaScript
react hooks 学习进阶
【7月更文挑战第12天】 React Hooks(自16.8版起)让函数组件能处理状态和副作用。useState用于添加状态管理,useEffect处理副作用,useContext共享数据,useReducer处理复杂状态逻辑,useRef获取引用。进阶技巧涉及性能优化,如useMemo和useCallback,以及遵循规则避免在不适当位置调用Hooks。理解异步更新机制和结合Redux等库提升应用复杂性管理。持续学习新技巧是关键。
79 0
|
8月前
|
前端开发
Vue3 【仿 react 的 hook】封装 useTitle
Vue3 【仿 react 的 hook】封装 useTitle
86 0
|
8月前
|
前端开发 API
Vue3 【仿 react 的 hook】封装 useLocation
Vue3 【仿 react 的 hook】封装 useLocation
67 0
|
8月前
|
缓存
react18【系列实用教程】useMemo —— 缓存数据 (2024最新版)
react18【系列实用教程】useMemo —— 缓存数据 (2024最新版)
173 0