React的memo和useMemo的作用

简介: React的memo和useMemo的作用

要想学习useMemo必须要先知道React.memo

这两者都有一定的优化作用


memo的作用


当数据变化时,代码会重新执行一遍,但是子组件数据没有变化也会执行,这个时候可以使用memo将子组件封装起来,让子组件的数据只在发生改变时才会执行


案例


点击按钮改变n的值,m不变,验证程序会不会执行m的代码


不使用memo的情况


只改变n的值时,虽然说m的值没变,但是也执行了Child的打印语句


function App(){
  const [n,setN] = useState(0);
  const [m,setM] = useState(0);
  const add=()=>{
    setN(i=>i+1);
  };
  const addChild=()=>{
    setM(i=>i+1);
  };
  return(
    <div>
      <div>
        n:{n}
        <button onClick={add}>n+1</button>
        <button onClick={addChild}>m+1</button>
      </div>
      <Child data={m} />
    </div>
  )
}
function Child(props){
  console.log('child执行了')
  return(
    <div>
      child:{props.data}
    </div>
      )
}
ReactDOM.render(<App />,document.getElementById('root'));

使用memo进行封装


将Child用memo封装一下,就可以使m不变就不执行Child,这个时候只要m的值不变,就不会执行Child组件

使用React.memo封装,会返回一个新的组件,调用新组件

function Child(props){
  console.log('child执行了')
  return(
    <div>
      child:{props.data}
    </div>
      )
}
// 封装child
const Child2 = React.memo(Child)
ReactDOM.render(<App />,document.getElementById('root'));

但是此时还有一个bug,如果在子组件Child上添加一个监听函数,无论修改m的值与否,都会执行Child组件

function App(){
  const [n,setN] = useState(0);
  const [m,setM] = useState(0);
  const add=()=>{
    setN(i=>i+1);
  };
  const addChild=()=>{
    setM(i=>i+1);
  };
+  const onClickChild=()=>{  };
  return(
    <div>
      <div>
        n:{n}
        <button onClick={add}>n+1</button>
        <button onClick={addChild}>m+1</button>
      </div>
+      <Child2 data={m} onClick={onClickChild} />
    </div>
  )
}
function Child(props){
  console.log('child执行了')
  console.log('这里有很多代码')
  return(
+    <div onClick={props.onClick}>
      child:{props.data}
    </div>
      )
}
const Child2 = React.memo(Child)

当点击n时,就会重新执行App代码,onClickChild空函数的地址会发生改变,所以说此时还是会执行Child的

而useMemo正是解决这个问题的


useMemo的作用


解决因函数更新而渲染自己的问题,就可以使用useMemo,使用它将函数重新封装

const onClickChild=useMemo(fn,array)监听变量,第一个参数是函数,第二个参数是依赖,只有依赖变化时才会重新计算函数

import React, { useMemo, useState } from 'react'
import ReactDOM from 'react-dom'
//其他的代码不变,只需要重写m的点击函数
  //使用useMemo重新写监听函数,当m变化时才会执行此代码
  const onClickChild=useMemo(()=>{
    return ()=>{
      console.log(m)
    }
  },[m])

也可以把useMemo替换成useCallback,使用useCallback就不用写return函数了

const onClickChild=useMemo(()=>{
    return ()=>{
      console.log(m)
    }
  },[m])
 //等价于
 const onClickChild=useCallback(()=>{
      console.log(m)
  },[m])

注意:


  • 如果你的value是个函数,那么你就要写成useMemo(()=>(x)=> console.log(x))
  • 这是一个返回函数的函数,比较复杂;于是就有了useCallback,你可以使用useCallback
目录
相关文章
|
2月前
|
前端开发
React Memo
10月更文挑战第11天
44 6
|
3月前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
106 1
|
3月前
|
缓存 前端开发
React中函数式Hooks之useMemo的使用
React的`useMemo` Hook 用于优化性能,通过记忆返回值避免重复计算。它接收一个函数和一个依赖数组,只有当依赖项改变时,才会重新计算被记忆的值。这可以用于避免在每次渲染时都进行昂贵的计算,或者防止子组件不必要的重新渲染。例如,可以在父组件中使用`useMemo`包裹子组件,以依赖特定的props,从而控制子组件的渲染。
43 0
|
4月前
|
缓存 前端开发 JavaScript
React.memo 与 useMemo 超厉害!深入浅出带你理解记忆化技术,让 React 性能优化更上一层楼!
【8月更文挑战第31天】在React开发中,性能优化至关重要。本文探讨了`React.memo`和`useMemo`两大利器,前者通过避免不必要的组件重渲染提升效率,后者则缓存计算结果,防止重复计算。结合示例代码,文章详细解析了如何运用这两个Hook进行性能优化,并强调了合理选择与谨慎使用的最佳实践,助你轻松掌握高效开发技巧。
123 0
|
5月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
110 1
|
5月前
|
缓存 前端开发
react18【系列实用教程】memo —— 缓存组件 (2024最新版)
react18【系列实用教程】memo —— 缓存组件 (2024最新版)
140 0
|
5月前
|
缓存
react18【系列实用教程】useMemo —— 缓存数据 (2024最新版)
react18【系列实用教程】useMemo —— 缓存数据 (2024最新版)
134 0
|
7月前
|
前端开发 开发者
React useMemo钩子指南:优化计算性能
React useMemo钩子指南:优化计算性能
|
存储 前端开发 JavaScript
React Memo不是你优化的第一选择(二)
React Memo不是你优化的第一选择(二)
|
7月前
|
缓存 前端开发 JavaScript
React.Memo和useMemo的区别?
React.Memo和useMemo的区别?
209 0