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 会被重新赋值。

目录
相关文章
|
5月前
|
前端开发
轻松掌握 React Hooks:简化状态与副作用管理
轻松掌握 React Hooks:简化状态与副作用管理
199 80
|
5月前
|
前端开发
React Hooks数据获取:避免内存泄漏的实战指南
React Hooks数据获取:避免内存泄漏的实战指南
|
1月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
12月前
|
前端开发
React Hooks:从基础到进阶的深入理解
React Hooks:从基础到进阶的深入理解
246 2
|
12月前
|
前端开发 JavaScript
React Hooks 深入解析
React Hooks 深入解析
153 0
|
6月前
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
261 68
|
6月前
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
237 67
|
6月前
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
261 62
|
8月前
|
前端开发 JavaScript
除了使用Route组件,React Router还有其他方式处理404错误页面吗
除了使用Route组件,React Router还有其他方式处理404错误页面吗
222 58
|
8月前
|
前端开发
React 中高阶组件的原理是什么?
React 中高阶组件的原理是什么?
214 57