網站首頁 編程語言 正文
正文
memo用來優化函數組件的重復渲染行為,針對的是一個組件
useMemo返回一個memoized的值
本質都是用同樣的算法來判定依賴是否發生改變,繼而決定是否觸發memo或者useMemo中的邏輯,利用memo就可以避免不必要的重復計算,減少資源浪費
useCallback返回一個memoized的函數
useMemo和useCallback都接收兩個參數,第一個參數為fn,第二個參數為[],數組中是變化依賴的參數 memo則可以直接作用于組件,例如
export default memo(Mycomponent)
useMemo和useEffect的執行時機是不一致的:useEffect執行的是副作用,所以一定是在渲染之后執行的,useMemo是需要有返回值的,而返回值可以直接參與渲染的,所以useMemo是在渲染期間完成的
memo使用
// 父組件
const Parent = ()=>{
const [count, setCount] = useState(1)
const addCount = ()=>{
setCount(count + 1)
}
return(
<>
<div onClick={addCount}>計數: {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的值變化時才會觸發sum函數執行
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}>計數: {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,則點擊父組件計數的同時,子組件會console進行渲染,
// 因為更新count時父組件會重新渲染,導致重新生成了一個changeName函數,
// 所以子組件的props變了,導致子組件會重新渲染
// 而對changeName函數用useCallback進行包裹,則對函數進行緩存不會重新生成
原文鏈接:https://juejin.cn/post/7079379468032147463
相關推薦
- 2021-12-03 Go語言原子操作及互斥鎖的區別_Golang
- 2022-07-13 Docker 數據管理
- 2022-07-07 淺談Redis的異步機制_Redis
- 2022-07-03 C語言中二級指針解析(指向指針的指針)_C 語言
- 2022-10-25 Git中bundle命令的使用詳解_相關技巧
- 2022-06-20 C語言三種方法解決輪轉數組問題_C 語言
- 2022-12-09 ReactQuery?渲染優化示例詳解_React
- 2022-01-11 npm install 報錯 gyp info it worked if it ends with
- 最近更新
-
- 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同步修改后的遠程分支