網站首頁 編程語言 正文
看官方的文檔介紹這兩個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
相關推薦
- 2022-12-10 Qt之簡單的異步操作實現方法_C 語言
- 2023-01-23 Python操作MongoDB增刪改查代碼示例_python
- 2022-03-17 正確使用dotnet-*工具的方法_實用技巧
- 2023-10-15 獲取當天開始時間零點和結束時間24點的時間以及時間戳
- 2023-01-01 Pytest使用logging模塊寫日志的實例詳解_python
- 2022-09-13 iOS開發之UIMenuController使用示例詳解_IOS
- 2022-07-19 Python數據分析?Pandas?Series對象操作_python
- 2022-05-22 prometheus監控nginx的實現_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支