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;
AI 代码解读

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

页面首次加载的时候渲染组件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;
AI 代码解读

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;
AI 代码解读

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

目录
相关文章
|
4月前
|
React Hooks:从基础到进阶的深入理解
React Hooks:从基础到进阶的深入理解
86 2
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。
|
4月前
|
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
50 3
React Hooks 深入解析
React Hooks 深入解析
58 0
深入理解React Hooks,打造高效响应式UI
深入理解React Hooks,打造高效响应式UI
66 0
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
135 9
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
324 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
使用React和Redux构建高效的前端应用
使用React和Redux构建高效的前端应用
83 2