React中的useMemo 和 useEffect 執(zhí)行順序
在 React 組件的渲染過程中,useMemo 和 useEffect 的執(zhí)行順序是不同的。具體來說:
- useMemo 先執(zhí)行:useMemo 是在 渲染階段 執(zhí)行的,它的作用是緩存計(jì)算結(jié)果,確保在渲染過程中可以直接使用緩存的值。
- useEffect 后執(zhí)行:useEffect 是在 提交階段 執(zhí)行的,它的作用是處理副作用(如數(shù)據(jù)獲取、DOM 操作等),并且是在 DOM 更新之后才運(yùn)行。
詳細(xì)執(zhí)行順序
組件渲染階段:
- React 調(diào)用組件的渲染方法(函數(shù)組件的函數(shù)體或類組件的 render 方法)。
- 在渲染過程中,useMemo 會(huì)被執(zhí)行,計(jì)算并緩存值。
- 如果依賴項(xiàng)沒有變化,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í)行:無論它寫在 useEffect 上面還是下面,它都會(huì)在組件渲染時(shí)執(zhí)行。
- useEffect 在提交階段執(zhí)行:它總是在 DOM 更新后執(zhí)行,與代碼書寫順序無關(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+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng)思路詳解
這篇文章主要介紹了react+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06淺談webpack+react多頁面開發(fā)終極架構(gòu)
這篇文章主要介紹了淺談webpack+react多頁面開發(fā)終極架構(gòu),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11ReactNative踩坑之配置調(diào)試端口的解決方法
本篇文章主要介紹了ReactNative踩坑之配置調(diào)試端口的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07React 進(jìn)入頁面后自動(dòng) focus 到某個(gè)輸入框的解決方案
React.js 當(dāng)中提供了 ref 屬性來幫助我們獲取已經(jīng)掛載的元素的 DOM 節(jié)點(diǎn),你可以給某個(gè) JSX 元素加上 ref屬性,這篇文章主要介紹了React 進(jìn)入頁面以后自動(dòng) focus 到某個(gè)輸入框,需要的朋友可以參考下2024-02-02原生+React實(shí)現(xiàn)懶加載(無限滾動(dòng))列表方式
這篇文章主要介紹了原生+React實(shí)現(xiàn)懶加載(無限滾動(dòng))列表方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03