溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

React中useMemo與useCallback的區(qū)別是什么

發(fā)布時間:2022-08-18 09:37:16 來源:億速云 閱讀:169 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“React中useMemo與useCallback的區(qū)別是什么”,在日常操作中,相信很多人在React中useMemo與useCallback的區(qū)別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”React中useMemo與useCallback的區(qū)別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

useMemo

把“創(chuàng)建”函數(shù)和依賴項數(shù)組作為參數(shù)傳?入useMemo,它僅會在某個依賴項改變時才重新計算memoized 值。這種優(yōu)化有助于避免在每次渲染時都進?行行?高開銷的計算。

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><h4>UseMemoPage</h4>
    <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ù)及依賴項數(shù)組作為參數(shù)傳?入useCallback,它將返回該回調(diào)函數(shù)的 memoized 版本,該回調(diào)函數(shù)僅在某個依賴項改變時才會更更新。當(dāng)你把回調(diào)函數(shù)傳遞給經(jīng)過優(yōu)化的并使?用引?用相等性去避免?非必要渲染(例例如shouldComponentUpdate)的?子組件時,它將?非常有?用

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><h4>UseCallbackPage</h4>
  <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><h4>Child</h4>
        <buttononClick={() =>console.log(addClick())}>add</button></div>   
     )
  }
}

useCallback(fn, deps)相當(dāng)于useMemo(() => fn, deps)。

注意依賴項數(shù)組不不會作為參數(shù)傳給“創(chuàng)建”函數(shù)。雖然從概念上來說它表現(xiàn)為:所有“創(chuàng)建”函數(shù)中引?用的值都應(yīng)該出現(xiàn)在依賴項數(shù)組中。未來編譯器?會更更加智能,屆時?自動創(chuàng)建數(shù)組將成為可能。

補充介紹React的memo與useMemo及useCallback

React.memo

  • 概念解析

    • 將組件在相同的情況下的渲染結(jié)果,緩存渲染結(jié)果

    • 當(dāng)組件傳入props相同的參數(shù)時,淺對比之后有之前的傳入項,則復(fù)用緩存最近一次結(jié)果

    • 數(shù)據(jù)對比,只做淺對比。如果需要控制對比過程,需要自己寫自定義比對函數(shù)。傳參數(shù)置第二個參數(shù) -請注意不要與 shouldComponetUpdate 返回值混合

類組件通過比對數(shù)據(jù),可以控制渲染的方式?

  • React.PureComponent

  • shouldComponentUpdate

hooks的useMemo

  • 概念解析

    • 函數(shù)組件的緩存渲染結(jié)果

    • 可以將當(dāng)前的組件節(jié)點顆?;?/p>

    • 通過第二個參數(shù)去判斷,是否更新useMemo的回調(diào)函數(shù)

    • 回調(diào)函數(shù)是一個必包,如果創(chuàng)建使用了 useState,會緩存 state 值,不會拿到實時更新的值

hooks的useCallback

  • 概念解析

    • 當(dāng)父級組件傳遞給子級組件一個函數(shù)時,無狀態(tài)組件每次都會重新生成新的props函數(shù),導(dǎo)致子組件刷新

    • 返回一個需要緩存的函數(shù)

    • 傳遞需要更新的依賴項,一般回調(diào)函數(shù)內(nèi)部使用的數(shù)據(jù),都需要添加在依賴項中

    • 避免父子之間,子級生成新的props函數(shù),從而刷新子組件

    • 一般聯(lián)合useMemo一起使用

到此,關(guān)于“React中useMemo與useCallback的區(qū)別是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI