解析React中useMemo與useCallback的區(qū)別
useMemo
把“創(chuàng)建”函數(shù)和依賴項(xiàng)數(shù)組作為參數(shù)傳?入useMemo,它僅會(huì)在某個(gè)依賴項(xiàng)改變時(shí)才重新計(jì)算memoized 值。這種優(yōu)化有助于避免在每次渲染時(shí)都進(jìn)?行行?高開銷的計(jì)算。
importReact, { useState, useMemo } from"react";
export default functionUseMemoPage(props) {
const [count, setCount] =useState(0);
constexpensive=useMemo(() => {
console.log("compute");
let sum=0;
for (leti=0; i<count; i++) {
sum+=i;
}
return sum;//只有count變化,這?里里才重新執(zhí)?行行
}, [count]);
const [value, setValue] =useState("");
return (<div><h3>UseMemoPage</h3>
<p>expensive:{expensive}</p><p>{count}</p>
<button onClick={() =>setCount(count+1)}>add</button>
<input value={value} onChange={event=>setValue(event.target.value)} /></div> );
} useCallback
把內(nèi)聯(lián)回調(diào)函數(shù)及依賴項(xiàng)數(shù)組作為參數(shù)傳?入useCallback,它將返回該回調(diào)函數(shù)的 memoized 版本,該回調(diào)函數(shù)僅在某個(gè)依賴項(xiàng)改變時(shí)才會(huì)更更新。當(dāng)你把回調(diào)函數(shù)傳遞給經(jīng)過優(yōu)化的并使?用引?用相等性去避免?非必要渲染(例例如shouldComponentUpdate)的?子組件時(shí),它將?非常有?用
importReact, { useState, useCallback, PureComponent } from"react";
export default function UseCallbackPage(props) {
const [count, setCount] =useState(0);
const addClick=useCallback(() => {
let sum=0;
for (leti=0; i<count; i++) {
sum+=i;
}
return sum;
}, [count]);
const [value, setValue] =useState("");
return (
<div><h3>UseCallbackPage</h3>
<p>{count}</p>
<buttononClick={() =>setCount(count+1)}>add</button>
<inputvalue={value} onChange={event=>setValue(event.target.value)} />
<ChildaddClick={addClick} /></div> );
}
class ChildextendsPureComponent {
render() {
console.log("child render");
const { addClick } =this.props;
return (
<div><h3>Child</h3>
<buttononClick={() =>console.log(addClick())}>add</button></div>
)
}
}useCallback(fn, deps)相當(dāng)于useMemo(() => fn, deps)。
注意依賴項(xiàng)數(shù)組不不會(huì)作為參數(shù)傳給“創(chuàng)建”函數(shù)。雖然從概念上來說它表現(xiàn)為:所有“創(chuàng)建”函數(shù)中引?用的值都應(yīng)該出現(xiàn)在依賴項(xiàng)數(shù)組中。未來編譯器?會(huì)更更加智能,屆時(shí)?自動(dòng)創(chuàng)建數(shù)組將成為可能。
補(bǔ)充介紹React的memo與useMemo及useCallback
React.memo
- 概念解析
- 將組件在相同的情況下的渲染結(jié)果,緩存渲染結(jié)果
- 當(dāng)組件傳入
props相同的參數(shù)時(shí),淺對比之后有之前的傳入項(xiàng),則復(fù)用緩存最近一次結(jié)果 - 數(shù)據(jù)對比,只做淺對比。如果需要控制對比過程,需要自己寫自定義比對函數(shù)。傳參數(shù)置第二個(gè)參數(shù) -請注意不要與
shouldComponetUpdate返回值混合
類組件通過比對數(shù)據(jù),可以控制渲染的方式?
React.PureComponentshouldComponentUpdate
hooks的useMemo
- 概念解析
- 函數(shù)組件的緩存渲染結(jié)果
- 可以將當(dāng)前的組件節(jié)點(diǎn)顆?;?/li>
- 通過第二個(gè)參數(shù)去判斷,是否更新useMemo的回調(diào)函數(shù)
- 回調(diào)函數(shù)是一個(gè)必包,如果創(chuàng)建使用了
useState,會(huì)緩存 state 值,不會(huì)拿到實(shí)時(shí)更新的值
hooks的useCallback
- 概念解析
- 返回一個(gè)需要緩存的函數(shù)
- 傳遞需要更新的依賴項(xiàng),一般回調(diào)函數(shù)內(nèi)部使用的數(shù)據(jù),都需要添加在依賴項(xiàng)中
- 避免父子之間,子級生成新的props函數(shù),從而刷新子組件
- 當(dāng)父級組件傳遞給子級組件一個(gè)函數(shù)時(shí),無狀態(tài)組件每次都會(huì)重新生成新的props函數(shù),導(dǎo)致子組件刷新
- 一般聯(lián)合useMemo一起使用
到此這篇關(guān)于React中useMemo與useCallback的區(qū)別的文章就介紹到這了,更多相關(guān)React useMemo與useCallback區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- React Hooks之使用useCallback和useMemo進(jìn)行性能優(yōu)化方式
- 詳解React中的useMemo和useCallback的區(qū)別
- 深入React?18源碼useMemo?useCallback?memo用法及區(qū)別分析
- React中memo useCallback useMemo方法作用及使用場景
- React中useCallback useMemo使用方法快速精通
- React中useCallback useMemo到底該怎么用
- React源碼分析之useCallback與useMemo及useContext詳解
- react性能優(yōu)化useMemo與useCallback使用對比詳解
- React?正確使用useCallback?useMemo的方式
- React中useMemo、useCallback的具體使用
相關(guān)文章
ReactNative錯(cuò)誤采集原理在Android中實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了ReactNative錯(cuò)誤采集原理在Android中實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Vite+React搭建開發(fā)構(gòu)建環(huán)境實(shí)踐記錄
這篇文章主要介紹了Vite+React搭建開發(fā)構(gòu)建環(huán)境實(shí)踐,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
詳解如何在React應(yīng)用中實(shí)現(xiàn)多語言支持
隨著全球化的推進(jìn),網(wǎng)站和應(yīng)用程序需要支持多種語言以滿足不同地區(qū)用戶的需求,國際化(i18n)是指設(shè)計(jì)和開發(fā)能夠適應(yīng)不同語言和文化環(huán)境的產(chǎn)品,在 React 應(yīng)用中實(shí)現(xiàn)國際化可以提高用戶體驗(yàn)并擴(kuò)大應(yīng)用的受眾范圍,本文將介紹如何在 React 應(yīng)用中實(shí)現(xiàn)多語言支持2025-04-04
詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用
這篇文章主要介紹了詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
React報(bào)錯(cuò)Type '() => JSX.Element[]&apos
這篇文章主要為大家介紹了React報(bào)錯(cuò)Type '() => JSX.Element[]' is not assignable to type FunctionComponent解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

