最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React useMemo與useCallabck有什么區(qū)別

 更新時間:2022年12月20日 11:59:20   作者:地鐵程序員  
useCallback和useMemo是一樣的東西,只是入?yún)⒂兴煌瑄seCallback緩存的是回調函數(shù),如果依賴項沒有更新,就會使用緩存的回調函數(shù);useMemo緩存的是回調函數(shù)的return,如果依賴項沒有更新,就會使用緩存的return

看官方的文檔介紹這兩個api的概念

useMemo

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

返回一個 memoized 值。

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

2、如果沒有提供依賴項數(shù)組,useMemo 在每次渲染時都會計算新的值。

useCallback

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

返回一個 memoized 回調函數(shù)。

把內聯(lián)回調函數(shù)及依賴項數(shù)組作為參數(shù)傳入 useCallback,它將返回該回調函數(shù)的 memoized 版本,該回調函數(shù)僅在某個依賴項改變時才會更新。當你把回調函數(shù)傳遞給經過優(yōu)化的并使用引用相等性去避免非必要渲染(例如 shouldComponentUpdate)的子組件時,它將非常有用。

useCallback(fn, deps) 相當于 useMemo(() => fn, deps)

看TS類型

 /**
     * `useMemo` will only recompute the memoized value when one of the `deps` has changed.
     *
     * @version 16.8.0
     * @see https://reactjs.org/docs/hooks-reference.html#usememo
     */
    // allow undefined, but don't make it optional as that is very likely a mistake
    function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;
 /**
     * `useCallback` will return a memoized version of the callback that only changes if one of the `inputs`
     * has changed.
     *
     * @version 16.8.0
     * @see https://reactjs.org/docs/hooks-reference.html#usecallback
     */
    // A specific function type would not trigger implicit any.
    // See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/52873#issuecomment-845806435 for a comparison between `Function` and more specific types.
    // tslint:disable-next-line ban-types
    function useCallback<T extends Function>(callback: T, deps: DependencyList): T;
  • 泛型 T 在 useCallback 中是一個鉤子函數(shù)
  • 在 useMemo 中是一個返回值。

總結

返回的值類型不同

  • useMemo 返回的是計算值
  • useCallback 返回的是一個回調函數(shù)

來個 demo

import React, { FC, useCallback, useMemo, useState } from 'react';
const Index: FC = (props) => {
  const [count, setCount] = useState(0);
  const isEvenNumber = useMemo(() => {
    return count % 2 === 0;
  }, [count]);
  const onClick = useCallback(() => {
    setCount(count + 1);
  }, [count]);
  return (
    <div>
      <div>{count} is {isEvenNumber ? 'even':'odd'} number</div>
      <button onClick={onClick}></button>
    </div>
  );
};

useCallback 和 useMemo 的參數(shù)都是一個函數(shù)加一個依賴數(shù)組,依賴沒有改變時直接返回內存中緩存的結果,無需重復計算。簡單理解就是 useCallback 緩存事件處理函數(shù),useMemo 緩存二次計算的結果,如上面的點擊事件,以及通過 count 值判斷奇數(shù)偶數(shù)的二次計算結果。

本質原因

React 的函數(shù)組件是非常好用的東西,相比 class 寫法以及 Vue 的對象掛載寫法簡潔很多,代碼測試復用成本低,容易入手,但也帶來一些問題,無狀態(tài)函數(shù)很理想,但現(xiàn)實有一些計算開銷大、組件渲染頻繁的場景是需要狀態(tài)的,每次都計算一遍狀態(tài)(callback 和 二次計算值)無疑很浪費內存,函數(shù)不像對象(React class 寫法或者 Vue 組件寫法)可以直接將狀態(tài)掛載在自身,沒有浪費內存的問題,要實現(xiàn)類似的效果只能找一個的內存掛載點掛載這些東東,所以有了 useCallback 和 useMemo 這些 hook。

到此這篇關于React useMemo與useCallabck有什么區(qū)別的文章就介紹到這了,更多相關React useCallback useMemo內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • React-three-fiber使用初體驗

    React-three-fiber使用初體驗

    這篇文章主要為大家介紹了React-three-fiber的使用初體驗,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 再次談論React.js實現(xiàn)原生js拖拽效果引起的一系列問題

    再次談論React.js實現(xiàn)原生js拖拽效果引起的一系列問題

    React 起源于 Facebook 的內部項目,因為該公司對市場上所有 JavaScript MVC 框架,都不滿意,就決定自己寫一套,用來架設 Instagram 的網站.本文給大家介紹React.js實現(xiàn)原生js拖拽效果,需要的朋友一起學習吧
    2016-04-04
  • React 路由react-router-dom示例詳解

    React 路由react-router-dom示例詳解

    一個路由就是一個映射關系(key:value),key為路徑, value可能是function或component,本文給大家介紹React 路由react-router-dom詳解,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • 如何不使用eject修改create-react-app的配置

    如何不使用eject修改create-react-app的配置

    許多剛開始接觸create-react-app框架的同學,不免都會有個疑問:如何在不執(zhí)行eject操作的同時,修改create-react-app的配置。
    2021-04-04
  • React聲明組件的方法總結

    React聲明組件的方法總結

    這篇文章主要給大家介紹了react聲明組件有哪幾種方法,各有什么不同,文章通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • React state狀態(tài)屬性詳細講解

    React state狀態(tài)屬性詳細講解

    React將組件(component)看成一個狀態(tài)機(State Machines),通過其內部自定義的狀態(tài)(State)和生命周期(Lifecycle)實現(xiàn)并與用戶交互,維持組件的不同狀態(tài)
    2022-09-09
  • es6在react中的應用代碼解析

    es6在react中的應用代碼解析

    這篇文章主要介紹了es6在react中的應用代碼解析,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • React在定時器中無法獲取狀態(tài)最新值的問題

    React在定時器中無法獲取狀態(tài)最新值的問題

    這篇文章主要介紹了React在定時器中無法獲取狀態(tài)最新值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 在react項目中webpack使用mock數(shù)據(jù)的操作方法

    在react項目中webpack使用mock數(shù)據(jù)的操作方法

    這篇文章主要介紹了在react項目中webpack使用mock數(shù)據(jù)的操作方法,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • React Native中TabBarIOS的簡單使用方法示例

    React Native中TabBarIOS的簡單使用方法示例

    最近在學習過程中遇到了很多問題,TabBarIOS的使用就是一個,所以下面這篇文章主要給大家介紹了關于React Native中TabBarIOS簡單使用的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-10-10

最新評論

同德县| 泸州市| 山东| 昌乐县| 灵山县| 通许县| 陇西县| 宁津县| 尼玛县| 乌兰察布市| 老河口市| 沾化县| 维西| 温宿县| 图木舒克市| 金川县| 夏津县| 凉山| 微博| 荆门市| 万宁市| 冷水江市| 德安县| 阿尔山市| 田阳县| 禹州市| 泗水县| 饶阳县| 若尔盖县| 东港市| 南丹县| 金华市| 廉江市| 靖边县| 北京市| 巴彦淖尔市| 大渡口区| 龙泉市| 临清市| 新田县| 宝坻区|