<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家在使用 React 框架進行開發時一定遇到過以下問題:
以下面 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秒後的執行結構如下圖所示:
很顯然首次渲染執行了,useMemo,而2秒後有狀態變化後沒有執行useMemo。
點選按鈕改變 useMemo 的依賴項後可以發現,如下圖所示 useMemo 又執行了。
因此在使用函數式元件時,可以使用 useMemo 減少不必要的reRender 提高元件的效能;
在以上元件的基礎上,給App 增加一個子元件,程式碼如下所示:
import React from 'react' export default function Children(props) { console.log('子元件執行了,接收的props是', props) console.log('子元件渲染分割線------------------------------------------') return <div>子元件</div> }
首次render 以及 2s後元件的 reRender 控制檯列印結果如下圖所示:
由上圖可以看出,reRender 時Children 元件的props並未變化,因此,此次Children 元件的reRender 是不必要的,需要進行優化;
如果 Children 的 props 是基本型別,則可以做一下優化:
import React, { memo } from 'react' function Children(props) { console.log('子元件執行了,接收的props是', props) console.log('子元件渲染分割線------------------------------------------') return <div>子元件</div> } export default memo(Children)
優化後控制檯列印如下資訊,一下資訊可以看出 Children 元件沒有進行 reRender
若子元件的 props 是參照型別 ,則需要進行深度比較,此時React.memo()要傳入第二個引數進行深度比較,改變後 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 第二個引數 ,通過比較 preProps 和 nextProps 返回一個布林值,使得props 進行深度比較;注意:React.memo的第二個引數進行深度比較時有一定開銷,其產生的開銷存在大於子元件reRender的可能
useMemo() 和 React.memo() 都是進行元件效能優化的方式,其區別是
到此這篇關於React.memo 和 useMemo 的使用問題小結的文章就介紹到這了,更多相關React.memo 和 useMemo內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45