react組件memo useMemo useCallback使用區(qū)別示例
正文
memo用來優(yōu)化函數組件的重復渲染行為,針對的是一個組件
useMemo返回一個memoized的值
本質都是用同樣的算法來判定依賴是否發(fā)生改變,繼而決定是否觸發(fā)memo或者useMemo中的邏輯,利用memo就可以避免不必要的重復計算,減少資源浪費
useCallback返回一個memoized的函數
useMemo和useCallback都接收兩個參數,第一個參數為fn,第二個參數為[],數組中是變化依賴的參數 memo則可以直接作用于組件,例如
export default memo(Mycomponent)
useMemo和useEffect的執(zhí)行時機是不一致的:useEffect執(zhí)行的是副作用,所以一定是在渲染之后執(zhí)行的,useMemo是需要有返回值的,而返回值可以直接參與渲染的,所以useMemo是在渲染期間完成的
memo使用
// 父組件 const Parent = ()=>{ const [count, setCount] = useState(1) const addCount = ()=>{ setCount(count + 1) } return( <> <div onClick={addCount}>計數: {count}</div> <Child /> </> ) } // 子組件 const Child = memo(()=>{ console.log('child start---') return( <div>child...</div> ) }) // 使用memo后,子組件的props或者state沒有變化時,將不會對子組件進行渲染
useMemo使用
const sum = ()=>{ return a+b } const result = useMemo(()=>{sum()},[a,b]) // 只有在a或者b的值變化時才會觸發(fā)sum函數執(zhí)行
useCallback使用
// 父組件,給子組件傳遞name和changeName方法 const Parent = () => { const [count, setCount] = useState(1); const [name, setName] = useState("bbz"); const addCount = () => { setCount(count + 1); }; const changeName = useCallback((n) => { setName(n); }, []); return ( <> <div onClick={addCount}>計數: {count}</div> <Child name={name} changeName={changeName} /> </> ); }; // 子組件 const Child = ({ name, changeName }) => { console.log("child start---"); return ( <div onClick={() => { changeName("bobozai"); }} > child comps: {name} </div> ); }; // 如果不使用useCallback,則點擊父組件計數的同時,子組件會console進行渲染, // 因為更新count時父組件會重新渲染,導致重新生成了一個changeName函數, // 所以子組件的props變了,導致子組件會重新渲染 // 而對changeName函數用useCallback進行包裹,則對函數進行緩存不會重新生成
以上就是react組件memo useMemo useCallback使用區(qū)別的詳細內容,更多關于react組件memo useMemo useCallback的資料請關注腳本之家其它相關文章!
相關文章
如何在React?Native開發(fā)中防止滑動過程中的誤觸
在使用React?Native開發(fā)的時,當我們快速滑動應用的時候,可能會出現誤觸,導致我們會點擊到頁面中的某一些點擊事件,誤觸導致頁面元素響應從而進行其他操作,表現出非常不好的用戶體驗。2023-05-05react項目打包后點擊index.html頁面出現空白的問題
這篇文章主要介紹了react項目打包后點擊index.html頁面出現空白的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06