React中的useMemo 和 useEffect 執(zhí)行順序
在 React 組件的渲染過(guò)程中,useMemo 和 useEffect 的執(zhí)行順序是不同的。具體來(lái)說(shuō):
- useMemo 先執(zhí)行:useMemo 是在 渲染階段 執(zhí)行的,它的作用是緩存計(jì)算結(jié)果,確保在渲染過(guò)程中可以直接使用緩存的值。
- useEffect 后執(zhí)行:useEffect 是在 提交階段 執(zhí)行的,它的作用是處理副作用(如數(shù)據(jù)獲取、DOM 操作等),并且是在 DOM 更新之后才運(yùn)行。
詳細(xì)執(zhí)行順序
組件渲染階段:
- React 調(diào)用組件的渲染方法(函數(shù)組件的函數(shù)體或類組件的 render 方法)。
- 在渲染過(guò)程中,useMemo 會(huì)被執(zhí)行,計(jì)算并緩存值。
- 如果依賴項(xiàng)沒(méi)有變化,useMemo 會(huì)直接返回緩存的值,避免重復(fù)計(jì)算。
DOM 更新階段:
- React 將組件的渲染結(jié)果應(yīng)用到 DOM 上,更新 UI。
提交階段:
- 在 DOM 更新完成后,React 會(huì)執(zhí)行 useEffect 中的副作用函數(shù)。
- 如果 useEffect 有清理函數(shù)(返回的函數(shù)),它會(huì)在組件卸載或依賴項(xiàng)變化時(shí)執(zhí)行。
示例代碼
import React, { useMemo, useEffect, useState } from 'react';
function MyComponent({ a, b }) {
// useEffect 寫在 useMemo 上面
useEffect(() => {
console.log('useEffect: Side effect after DOM update');
return () => {
console.log('useEffect: Cleanup');
};
}, [a, b]);
// useMemo 寫在 useEffect 下面
const memoizedValue = useMemo(() => {
console.log('useMemo: Calculating expensive value...');
return a + b;
}, [a, b]);
console.log('Render: Component rendering...');
return (
<div>
<p>Memoized Value: {memoizedValue}</p>
</div>
);
}
function App() {
const [a, setA] = useState(1);
const [b, setB] = useState(2);
return (
<div>
<MyComponent a={a} b= />
<button onClick={() => setA(a + 1)}>Increment A</button>
<button onClick={() => setB(b + 1)}>Increment B</button>
</div>
);
}控制臺(tái)輸出順序
當(dāng)組件首次渲染時(shí):
Render: Component rendering... useMemo: Calculating expensive value... useEffect: Side effect after DOM update
當(dāng) a 或 b 變化時(shí):
Render: Component rendering... useMemo: Calculating expensive value... useEffect: Cleanup useEffect: Side effect after DOM update
總結(jié)
- useMemo 在渲染階段執(zhí)行:無(wú)論它寫在 useEffect 上面還是下面,它都會(huì)在組件渲染時(shí)執(zhí)行。
- useEffect 在提交階段執(zhí)行:它總是在 DOM 更新后執(zhí)行,與代碼書寫順序無(wú)關(guān)。
- React 的執(zhí)行順序是固定的:useMemo 先執(zhí)行,useEffect 后執(zhí)行。
如果你需要在渲染階段避免昂貴的計(jì)算,使用 useMemo;如果你需要在 DOM 更新后執(zhí)行某些操作(如數(shù)據(jù)獲取或訂閱),使用 useEffect。
到此這篇關(guān)于React中的useMemo 和 useEffect 執(zhí)行順序的文章就介紹到這了,更多相關(guān)React useMemo 和 useEffect 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react無(wú)限滾動(dòng)組件的實(shí)現(xiàn)示例
本文主要介紹了react無(wú)限滾動(dòng)組件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
React路由動(dòng)畫切換實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了react-router 路由切換動(dòng)畫的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2022-12-12
react中的forwardRef 和memo的區(qū)別解析
forwardRef和memo是React中用于性能優(yōu)化和組件復(fù)用的兩個(gè)高階函數(shù),本文給大家介紹react中的forwardRef 和memo的區(qū)別及適用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧2023-10-10
JavaScript中的useRef 和 useState介紹
這篇文章主要給大家分享的是 JavaScript中的useRef 和 useState介紹,下列文章,我們將學(xué)習(xí) useRef 和 useState hook是什么,它們的區(qū)別以及何時(shí)使用哪個(gè)。 這篇文章中的代碼示例將僅涉及功能組件,但是大多數(shù)差異和用途涵蓋了類和功能組件,需要的朋友可以參考一下2021-11-11
ahooks控制時(shí)機(jī)的hook實(shí)現(xiàn)方法
這篇文章主要為大家介紹了ahooks控制時(shí)機(jī)的hook實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
React19 新增Hooks中useOptimistic的使用
useOptimistic是React提供的一個(gè)Hooks,用于實(shí)現(xiàn)樂(lè)觀更新UI的效果,適用于評(píng)論發(fā)送等需要即時(shí)反饋的場(chǎng)景,下面就來(lái)詳細(xì)的介紹一下2026-05-05

