網站首頁 編程語言 正文
正文
memo用來優(yōu)化函數(shù)組件的重復渲染行為,針對的是一個組件
useMemo返回一個memoized的值
本質都是用同樣的算法來判定依賴是否發(fā)生改變,繼而決定是否觸發(fā)memo或者useMemo中的邏輯,利用memo就可以避免不必要的重復計算,減少資源浪費
useCallback返回一個memoized的函數(shù)
useMemo和useCallback都接收兩個參數(shù),第一個參數(shù)為fn,第二個參數(shù)為[],數(shù)組中是變化依賴的參數(shù) memo則可以直接作用于組件,例如
export default memo(Mycomponent)
useMemo和useEffect的執(zhí)行時機是不一致的:useEffect執(zhí)行的是副作用,所以一定是在渲染之后執(zhí)行的,useMemo是需要有返回值的,而返回值可以直接參與渲染的,所以useMemo是在渲染期間完成的
memo使用
// 父組件
const Parent = ()=>{
const [count, setCount] = useState(1)
const addCount = ()=>{
setCount(count + 1)
}
return(
<>
<div onClick={addCount}>計數(shù): {count}</div>
<Child />
</>
)
}
// 子組件
const Child = memo(()=>{
console.log('child start---')
return(
<div>child...</div>
)
})
// 使用memo后,子組件的props或者state沒有變化時,將不會對子組件進行渲染
useMemo使用
const sum = ()=>{
return a+b
}
const result = useMemo(()=>{sum()},[a,b])
// 只有在a或者b的值變化時才會觸發(fā)sum函數(shù)執(zhí)行
useCallback使用
// 父組件,給子組件傳遞name和changeName方法
const Parent = () => {
const [count, setCount] = useState(1);
const [name, setName] = useState("bbz");
const addCount = () => {
setCount(count + 1);
};
const changeName = useCallback((n) => {
setName(n);
}, []);
return (
<>
<div onClick={addCount}>計數(shù): {count}</div>
<Child name={name} changeName={changeName} />
</>
);
};
// 子組件
const Child = ({ name, changeName }) => {
console.log("child start---");
return (
<div
onClick={() => {
changeName("bobozai");
}}
>
child comps: {name}
</div>
);
};
// 如果不使用useCallback,則點擊父組件計數(shù)的同時,子組件會console進行渲染,
// 因為更新count時父組件會重新渲染,導致重新生成了一個changeName函數(shù),
// 所以子組件的props變了,導致子組件會重新渲染
// 而對changeName函數(shù)用useCallback進行包裹,則對函數(shù)進行緩存不會重新生成
原文鏈接:https://juejin.cn/post/7079379468032147463
相關推薦
- 2022-07-22 mybatis一級緩存和二級緩存理解與區(qū)別
- 2022-12-15 Pytorch加載數(shù)據(jù)集的方式總結及補充_python
- 2022-09-24 win2003下FTP服務器搭建教程_FTP服務器
- 2022-08-28 使用Freemarker生成靜態(tài)頁面
- 2022-06-06 C#實現(xiàn)Excel轉PDF時設置內容適應頁面寬度_C#教程
- 2021-12-06 C語言練習之數(shù)組中素數(shù)交換_C 語言
- 2022-08-26 Python批量將csv文件編碼方式轉換為UTF-8的實戰(zhàn)記錄_python
- 2022-06-02 Android?Apk反編譯及加密教程_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支