React中函数式Hooks之useMemo的使用

简介: React的`useMemo` Hook 用于优化性能,通过记忆返回值避免重复计算。它接收一个函数和一个依赖数组,只有当依赖项改变时,才会重新计算被记忆的值。这可以用于避免在每次渲染时都进行昂贵的计算,或者防止子组件不必要的重新渲染。例如,可以在父组件中使用`useMemo`包裹子组件,以依赖特定的props,从而控制子组件的渲染。

首先看一下原始代码:
我们写了三个组件,跟组件,和组件A、组件B;
他们的嵌套关系是跟组件中两个兄弟组件A和B;


import './App.css';
import React from 'react'
function App() {
   
  let [nameA, setNameA] = React.useState('zjqA')
  let [nameB, setNameB] = React.useState('zjqB')
  const changeNameFunA = () => {
   
    setNameA("AAAA")
  }
  const changeNameFunB = () => {
   
    setNameB("BBBB")
  }

  return (
    <div>

      <A name={
   nameA} />
      <B name={
   nameB} />
      <button onClick={
   changeNameFunA}>点击改变nameA</button>
      <button onClick={
   changeNameFunB}>点击改变nameB</button>
    </div>
  );
}

const A = ({
    name }) => {
   
  console.log("A组件重新渲染")
  return (
    <>
      <h1>我是A组件:{
   name}</h1>
    </>
  )
}
const B = ({
    name }) => {
   
  console.log("B组件重新渲染")
  return (
    <>
      <h1>我是B组件:{
   name}</h1>
    </>
  )
}

export default App;

页面样式:
在这里插入图片描述

页面首次加载的时候渲染组件A和组件B的时候会执行A和B组件中的打印语句:
在这里插入图片描述
当我们点击第一个按钮"点击改变nameA",我们会发现控制台同时执行了A、B组件中的打印。因为父组件渲染,导致所有子组件都随之重新渲染。

这个其实我们在类组件中可以很好的解决:
1.shouldComponentUpdate这个钩子做判断返回true或者false
2.ComponentPure 使用纯组件

在hooks中我们使用useMemo:

useMemo用法

import './App.css';
import React from 'react'
function App() {
   
  let [nameA, setNameA] = React.useState('zjqA')
  let [nameB, setNameB] = React.useState('zjqB')
  const changeNameFunA = () => {
   
    setNameA("AAAA")
  }
  const changeNameFunB = () => {
   
    setNameB("BBBB")
  }
  const comA = React.useMemo(() => <A name={
   nameA} />, [nameA])
  const comB = React.useMemo(() => <B name={
   nameB} />, [nameB])
  return (
    <div>
      {
   comA}
      {
   comB}
      <button onClick={
   changeNameFunA}>点击改变nameA</button>
      <button onClick={
   changeNameFunB}>点击改变nameB</button>
    </div>
  );
}

const A = ({
    name }) => {
   
  console.log("A组件重新渲染")
  return (
    <>
      <h1>我是A组件:{
   name}</h1>
    </>
  )
}
const B = ({
    name }) => {
   
  console.log("B组件重新渲染")
  return (
    <>
      <h1>我是B组件:{
   name}</h1>
    </>
  )
}

export default App;

useMemo不仅仅可以用来优化子组件渲染,

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

返回一个memoized值。 传递“创建”函数和依赖项数组。useMemo只会在其中一个依赖项发生更改时重新计算memoized值。此优化有助于避免在每个渲染上进行昂贵的计算。
可以堪称一个依赖项,a,b发生改变memoizedValue 才被重新赋值,有种缓存的感觉。

例子:

import './App.css';
import React from 'react'
function App() {
   
  let [name, setName] = React.useState('zjq')

  const changeNameFunA = () => {
   
    setName("AAAA")
  }
  const XHnameMemo = React.useMemo(()=>name+'小红',[name])

  return (
    <div>
      <h1>我的名字是:{
   name}</h1>
      <button onClick={
   changeNameFunA}>点击改变name</button>
      <h1>小红的名字是:{
   XHnameMemo}</h1>
    </div>
  );
}
export default App;

点击按钮的时候name、XHnameMemo都被重新赋值,原因是XHnameMemo依赖于name的值,所有有一种监听且依赖的效果,一旦name值发生改变XHnameMemo 会被重新赋值。

目录
相关文章
|
2天前
|
前端开发 JavaScript
React_函数式Hooks和Class比较优缺点
React Hooks与Class组件都能返回JSX并接收props,但Hooks无`this`指向问题,用`useEffect`模拟生命周期,`memo`优化性能,状态更新用`useState`;Class组件通过生命周期方法、`PureComponent`或`shouldComponentUpdate`优化,状态用`this.state`和`this.setState`管理。
10 1
React_函数式Hooks和Class比较优缺点
|
2天前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
9 1
|
2天前
|
前端开发
React使用hooks遇到的坑_state中的某几个属性数据变成了空字符
本文讨论了在React使用hooks时遇到的一个问题:state中的某些属性数据变成了空字符。作者通过在修改函数中重新解构赋值来获取最新的state值,解决了因数据更新不及时导致的问题。
7 0
|
1月前
|
前端开发 JavaScript UED
React 基础与实践 | 青训营笔记
React 基础与实践 | 青训营笔记
41 0
|
2月前
|
前端开发 JavaScript Java
React 速通笔记
【7月更文挑战第17天】
36 1
|
前端开发
前端学习笔记202305学习笔记第二十九天-React keep alive原理之2
前端学习笔记202305学习笔记第二十九天-React keep alive原理之2
70 0
|
前端开发
前端学习笔记202306学习笔记第四十八天-react-admin marmelab之8
前端学习笔记202306学习笔记第四十八天-react-admin marmelab之7
47 0
|
4月前
|
前端开发 JavaScript
前端知识笔记(二十六)———React如何像Vue一样将css和js写在同一文件
前端知识笔记(二十六)———React如何像Vue一样将css和js写在同一文件
57 1
|
10月前
|
前端开发
前端笔记:React的form表单全部置空或者某个操作框置空的做法
在React框架前端开发中,经常会有弹出框的开发,涉及到弹出框,难免就会有表单。一般在关闭弹出框或者对表单联动时,往往都需要考虑对表单进行置空操作了。
86 0
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
66 0