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

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

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

看官方的文檔介紹這兩個(gè)api的概念

useMemo

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

返回一個(gè) memoized 值。

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

2、如果沒(méi)有提供依賴(lài)項(xiàng)數(shù)組,useMemo 在每次渲染時(shí)都會(huì)計(jì)算新的值。

useCallback

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

返回一個(gè) memoized 回調(diào)函數(shù)。

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

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

看TS類(lèi)型

 /**
     * `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 中是一個(gè)鉤子函數(shù)
  • 在 useMemo 中是一個(gè)返回值。

總結(jié)

返回的值類(lèi)型不同

  • useMemo 返回的是計(jì)算值
  • useCallback 返回的是一個(gè)回調(diào)函數(shù)

來(lái)個(gè) 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ù)都是一個(gè)函數(shù)加一個(gè)依賴(lài)數(shù)組,依賴(lài)沒(méi)有改變時(shí)直接返回內(nèi)存中緩存的結(jié)果,無(wú)需重復(fù)計(jì)算。簡(jiǎn)單理解就是 useCallback 緩存事件處理函數(shù),useMemo 緩存二次計(jì)算的結(jié)果,如上面的點(diǎn)擊事件,以及通過(guò) count 值判斷奇數(shù)偶數(shù)的二次計(jì)算結(jié)果。

本質(zhì)原因

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

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

相關(guān)文章

  • React-three-fiber使用初體驗(yàn)

    React-three-fiber使用初體驗(yàn)

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

    再次談?wù)揜eact.js實(shí)現(xiàn)原生js拖拽效果引起的一系列問(wèn)題

    React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場(chǎng)上所有 JavaScript MVC 框架,都不滿(mǎn)意,就決定自己寫(xiě)一套,用來(lái)架設(shè) Instagram 的網(wǎng)站.本文給大家介紹React.js實(shí)現(xiàn)原生js拖拽效果,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • React 路由react-router-dom示例詳解

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

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

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

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

    React聲明組件的方法總結(jié)

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

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

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

    es6在react中的應(yīng)用代碼解析

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

    React在定時(shí)器中無(wú)法獲取狀態(tài)最新值的問(wèn)題

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

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

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

    React Native中TabBarIOS的簡(jiǎn)單使用方法示例

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

最新評(píng)論

四会市| 宣武区| 白水县| 手机| 安图县| 灵寿县| 罗平县| 昭通市| 齐河县| 高安市| 永登县| 遂川县| 蒙自县| 象山县| 孙吴县| 遵义县| 太仆寺旗| 屯留县| 铁岭市| 金塔县| 仁布县| 辽中县| 利川市| 芜湖市| 夹江县| 静安区| 凤冈县| 晋中市| 靖西县| 繁峙县| 洛宁县| 呈贡县| 常山县| 兖州市| 闸北区| 柘荣县| 梅州市| 田阳县| 德庆县| 黔江区| 理塘县|