亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

React.memo 和 useMemo 的使用問題小結(jié)

 更新時間:2022年11月04日 15:10:28   作者:前端小二哥  
隨著代碼的增加,每次的狀態(tài)改變,頁面進行一次 reRender ,這將產(chǎn)生很多不必要的 reRender 不僅浪費性能,從而導(dǎo)致頁面卡頓,這篇文章主要介紹了React.memo 和 useMemo 的使用問題小結(jié),需要的朋友可以參考下

問題背景

大家在使用 React 框架進行開發(fā)時一定遇到過以下問題:

  • 當(dāng)函數(shù)式組件中的某一狀態(tài)改變,整個組件刷新,重新渲染
  • 在類組件中 setState() 時,整個組件也會重新渲染
  • 以上問題若不進行優(yōu)化,導(dǎo)致的結(jié)果是:
  • 隨著代碼的增加,每次的狀態(tài)改變,頁面進行一次 reRender ,這將產(chǎn)生很多不必要的 reRender 不僅浪費性能,從而導(dǎo)致頁面卡頓;

useMemo 進行優(yōu)化

以下面 App 組件進行分析

import './App.css';
import ProfileTest from './components';
import { Profiler, useEffect, useMemo, useState, useRef } from 'react'
function App () {
  const [name, setName] = useState('')
  const [num, setNum] = useState(0)
  useEffect(() => {
    setTimeout(() => {
      console.log('111')
      setName('xxx')
    }, 2000)
  }, [])
  const memoVal = useMemo(() => {
    console.log('運行了useMemo num值為:', num);
    return num + 1
  }, [num])
  console.log('memoVal值為:', memoVal)
  console.log('父組件運行分割線----------------------------------------------------')
  const changeNum = () => {
    setNum(2)
  }
  return (
    <Profiler id='profile-test'>
      <div className="App">
        {/* <ProfileTest /> */}
        <button style={{ marginTop: 100 }} onClick={changeNum}>改變num</button>
      </div>
    </Profiler>
  );
}
export default App;

以上組件在首次渲染、以及 2秒后的執(zhí)行結(jié)構(gòu)如下圖所示:

很顯然首次渲染執(zhí)行了,useMemo,而2秒后有狀態(tài)變化后沒有執(zhí)行useMemo。
點擊按鈕改變 useMemo 的依賴項后可以發(fā)現(xiàn),如下圖所示 useMemo 又執(zhí)行了。

因此在使用函數(shù)式組件時,可以使用 useMemo 減少不必要的reRender 提高組件的性能;

React.memo 進行優(yōu)化

在以上組件的基礎(chǔ)上,給App 增加一個子組件,代碼如下所示:

import React from 'react'

export default function Children(props) {
  console.log('子組件運行了,接收的props是', props)
  console.log('子組件渲染分割線------------------------------------------')
  return <div>子組件</div>
}

首次render 以及 2s后組件的 reRender 控制臺打印結(jié)果如下圖所示:

由上圖可以看出,reRender 時Children 組件的props并未變化,因此,此次Children 組件的reRender 是不必要的,需要進行優(yōu)化;

props的值是基本類型

如果 Children 的 props 是基本類型,則可以做一下優(yōu)化:

import React, { memo } from 'react'

function Children(props) {
  console.log('子組件運行了,接收的props是', props)
  console.log('子組件渲染分割線------------------------------------------')
  return <div>子組件</div>
}
export default memo(Children)

優(yōu)化后控制臺打印如下信息,一下信息可以看出 Children 組件沒有進行 reRender

props的值是引用類型

若子組件的 props 是引用類型 ,則需要進行深度比較,此時React.memo()要傳入第二個參數(shù)進行深度比較,改變后 Children 組件的代碼如下所示:

import React, { memo } from 'react'

function Children(props) {
  console.log('子組件運行了,接收的props是', props)
  console.log('子組件渲染分割線------------------------------------------')
  return <div>子組件</div>
}
export default memo(Children, (preProps, nextProps) => {
  return JSON.stringify(preProps) === JSON.stringify(nextProps)
})

以上 memo 第二個參數(shù) ,通過比較 preProps 和 nextProps 返回一個布爾值,使得props 進行深度比較;
注意:React.memo的第二個參數(shù)進行深度比較時有一定開銷,其產(chǎn)生的開銷存在大于子組件reRender的可能

寫在最后

useMemo() 和 React.memo() 都是進行組件性能優(yōu)化的方式,其區(qū)別是

  • useMemo 可以進行更加細粒度的優(yōu)化(有依賴項)
  • React.memo() 可以控制props的淺比較和深度比較
  • React.memo在沒有第二個參數(shù)的時候相當(dāng)于class中的PureComponent,當(dāng)增加了第二個參數(shù)的時候相當(dāng)于生命周期中的shouldComponentUpdate;

到此這篇關(guān)于React.memo 和 useMemo 的使用問題小結(jié)的文章就介紹到這了,更多相關(guān)React.memo 和 useMemo內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React的組件協(xié)同使用實現(xiàn)方式

    React的組件協(xié)同使用實現(xiàn)方式

    這篇文章主要介紹了React的組件協(xié)同使用,文中給大家提到在React開發(fā)中,有哪些場景的組件協(xié)同?又如何去實現(xiàn)組件的協(xié)同使用呢?本文都給大家提到,感興趣的朋友跟隨小編一起看看吧
    2021-09-09
  • 淺談React useDebounce 防抖原理

    淺談React useDebounce 防抖原理

    本文主要介紹了淺談React useDebounce 防抖原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • React實現(xiàn)一個拖拽排序組件的示例代碼

    React實現(xiàn)一個拖拽排序組件的示例代碼

    這篇文章主要給大家介紹了React實現(xiàn)一個拖拽排序組件?-?支持多行多列、支持TypeScript、支持Flip動畫、可自定義拖拽區(qū)域,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • react搭建環(huán)境時執(zhí)行npm start報錯start: 'react-scripts start'的解決

    react搭建環(huán)境時執(zhí)行npm start報錯start: 'react-scripts&

    這篇文章主要介紹了react搭建環(huán)境時執(zhí)行npm start報錯start: 'react-scripts start'的解決方案,具有很好的參考價值,希望杜對大家有所幫助,
    2023-10-10
  • 使用React?MUI庫實現(xiàn)用戶列表分頁功能

    使用React?MUI庫實現(xiàn)用戶列表分頁功能

    MUI是一款基于React的UI組件庫,可以方便地構(gòu)建美觀的用戶界面,使用MUI的DataTable組件和分頁器組件可以輕松實現(xiàn)用戶列表分頁功能,這篇文章使用MUI庫實現(xiàn)了用戶列表分頁功能,感興趣的同學(xué)可以參考下文
    2023-05-05
  • 在React項目中使用Eslint代碼檢查工具及常見問題

    在React項目中使用Eslint代碼檢查工具及常見問題

    這篇文章主要介紹了在React項目中使用Eslint代碼檢查工具及常見問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • react?路由權(quán)限動態(tài)菜單方案配置react-router-auth-plus

    react?路由權(quán)限動態(tài)菜單方案配置react-router-auth-plus

    這篇文章主要為大家介紹了react路由權(quán)限動態(tài)菜單方案react-router-auth-plus傻瓜式配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • React中setState更新狀態(tài)的兩種寫法

    React中setState更新狀態(tài)的兩種寫法

    在?React?中,我們經(jīng)常需要更新組件的狀態(tài)(state),使用?setState?方法是一種常見的方式來實現(xiàn)狀態(tài)的更新,而在使用?setState?方法時,有兩種不同的寫法,即對象式和函數(shù)式,本文將介紹這兩種寫法的區(qū)別和使用場景,需要的朋友可以參考下
    2024-03-03
  • 減少react組件不必要的重新渲染實現(xiàn)方法

    減少react組件不必要的重新渲染實現(xiàn)方法

    這篇文章主要為大家介紹了減少react組件不必要的重新渲染實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • React組件二次包裝的具體實現(xiàn)

    React組件二次包裝的具體實現(xiàn)

    本文主要介紹了React組件二次包裝的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論