日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

React?useMemo與useCallabck有什么區別_React

作者:地鐵程序員 ? 更新時間: 2023-01-20 編程語言

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

useMemo

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

返回一個 memoized 值。

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

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

useCallback

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

返回一個 memoized 回調函數。

把內聯回調函數及依賴項數組作為參數傳入 useCallback,它將返回該回調函數的 memoized 版本,該回調函數僅在某個依賴項改變時才會更新。當你把回調函數傳遞給經過優化的并使用引用相等性去避免非必要渲染(例如 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 中是一個鉤子函數
  • 在 useMemo 中是一個返回值。

總結

返回的值類型不同

  • useMemo 返回的是計算值
  • useCallback 返回的是一個回調函數

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

本質原因

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

原文鏈接:https://blog.csdn.net/weixin_56071908/article/details/128370642

欄目分類
最近更新