React Hooks UseCallback

? 開發環境:React Native + Taro + Typescript
useCallback的用途,主要用于性能優化:
1 避免不必要的子組件重渲染:當父組件重渲染時,如果傳遞給子組件的函數每次都是新創建的,即使子組件使用了 React.memo,也會導致子組件重新渲染。
2 作為其他 Hook 的依賴項:當函數被用作 useEffect、useMemo 或其他 Hook 的依賴項時,使用 useCallback 可以確保函數引用穩定,避免不必要的 effect 執行。
3 記憶化函數:對于創建成本較高的函數,使用 useCallback 可以避免在每次渲染時都重新創建。

? ? useCallback的優勢:
1 性能優化:通過緩存函數實例,減少不必要的重渲染和函數創建,提高應用性能。
2 避免無限循環:在 useEffect 中使用函數時,如果函數沒有使用 useCallback 包裝,可能會導致無限重渲染。
3 穩定的函數引用:確保在依賴項不變的情況下,函數引用保持不變,這對于優化子組件渲染特別有用。

? ? 使用時的注意事項:
1 不要過度使用:只有在確實需要優化性能時才使用 useCallback,因為useCallback本身也有性能開銷。
2 正確設置依賴數組:確保依賴數組中包含所有在函數內部使用且可能變化的值,否則可能導致閉包問題。
3 與 React.memo 配合使用:useCallback 通常與 React.memo 一起使用才能發揮最大效果。

? ? ? ? 下面是父組件:UseCallback

import React, { useState, useCallback, useEffect } from 'react'
import { View, Text, Button, ScrollView } from '@tarojs/components'
import styles from './plant.module.scss'
import Strawberry from './UseCallbackSub'const PlantManager: React.FC = ()=>{useEffect(()=>{console.log("父組件:useEffect, 組件重渲染!!!")})// 草本植物科目數量 初始化const [subjectNum, setSubjectNum] = useState(0)// 薔薇科的植物或水果的顏色 初始化const [rosaceaeColor, setrosaceaeColor] = useState('green')// 薔薇科的植物或水果size大小 初始化const [rosaceaeSize, setRosaceaeSize] = useState(5)// 薔薇科植物或水果的顏色 改變次數,需要改變草莓顏色時,需要在此加一const [changeColorNum, setChangeColorNum] = useState(0)// 沒有使用useCallback的函數,每次渲染都會創建新的函數實例const handleInrement = () => {console.log('父組件 handleInrement')// setSubjectNum(preSubjectNum => preSubjectNum + 1);}// 使用useCallback緩存函數,同樣改變subjectNum的值const handleUseCallbackChangeSubjectNum = useCallback(()=>{console.log('父組件 handleUseCallbackChangeSubjectNum')// setSubjectNum(preSubjectNum => preSubjectNum + 1);}, []); //這里的依賴數組為空,是因為setSubjectNum是穩定的// 使用useCallback緩存函數,并帶有依賴項// 改變子組件中草莓的顏色,并查看子組件渲染的時機與次數const handleChangeRosaceaeColor = useCallback(()=>{const color = rosaceaeColor === 'green' ? 'green' : 'red'setrosaceaeColor(color)}, [changeColorNum])const handleChangeColorNum = useCallback(()=>{setChangeColorNum(preNum => preNum + 1)}, [])// 使用useCallback緩存函數,沒有依賴項// 改變子組件中草莓的size大小,并查看子組件渲染的時機與次數const handleChangeRosaceaeSize = useCallback(()=>{setRosaceaeSize(preSize => preSize + 1)}, [])return (<ScrollViewscrollYscrollWithAnimationclassName={styles.scroll}style={{height: '40vh',}}><View className={styles.container}><View className={styles.showTextBox}><Text>草本植物的數量 subjectNum = {subjectNum}</Text><Text>薔薇科植物顏色需要改變的次數 = {changeColorNum}</Text><Strawberry color={rosaceaeColor}increment={handleInrement}changeSubjectNum={handleUseCallbackChangeSubjectNum}size={rosaceaeSize}></Strawberry></View><View className={styles.showTextBox}><Text className={styles.showText}>使用useCallback帶有依賴項,改變子組件中草莓的顏色</Text><Button onClick={handleChangeRosaceaeColor} className={styles.actionBox} >改變子組件的草莓顏色</Button><Button onClick={handleChangeColorNum} className={styles.actionBox}>需要改變薔薇科植物顏色時,給changeColorNum加一</Button></View><View className={styles.showTextBox}><Text className={styles.showText}>使用useCallback沒有帶依賴項,改變子組件中草莓size大小</Text><Button className={styles.actionBox} onClick={handleChangeRosaceaeSize}>改變子組件草莓的size</Button></View></View></ScrollView>)
}export default PlantManager

? ? ? ? 下面是子組件:UseCallbackSub

import React, { useEffect, memo } from 'react'
import { View, Text, Button } from '@tarojs/components'
import styles from './plant.module.scss'interface StrawberryProps {color: stringsize: numberincrement: ()=>voidchangeSubjectNum: ()=>void
}// 定義一個子組件,用于查看子組件的更新狀態const Strawberry: React.FC<StrawberryProps> = (props)=>{const { increment, changeSubjectNum } = props;useEffect(()=>{console.log("子組件重新渲染更新!!!")console.log("當前草莓的顏色: ", props.color);})return (<View className={styles.berryBox}><Text className={styles.showText}>子組件 草莓</Text><Text className={styles.berryTxt} style={{backgroundColor: props.color,}}>草莓的顏色</Text><Text className={styles.berryTxt}>草莓的大小size = {props.size}</Text><View className={styles.showTextBox}><Text className={styles.showText}>普通函數,沒有使用useCallback緩存, 每次都會重新創建</Text><Button className={styles.actionBox} onClick={increment}>增加草本植物的數量</Button></View><View className={styles.showTextBox}><Text className={styles.showText}>使用useCallback緩存函數</Text><Button className={styles.actionBox} onClick={changeSubjectNum}>增加草本植物的數量</Button></View></View>)}// export default Strawberry;
export default memo(Strawberry);

????????下面的文件是樣式:

.container {margin-top: 30px;margin-bottom: 50px;margin-left: 15px;margin-right: 15px;padding: 20px;background-color: darkgrey;
}.scroll {margin-top: 30px;margin-bottom: 30px;margin-left: 15px;margin-right: 15px;
}.showTextBox {background-color: antiquewhite;padding: 10px;text-align: center;margin-bottom: 30px;
}.showText {padding: 20px;text-align: center;margin-top: 18px;background-color: cornflowerblue;
}.actionBox {background-color: aquamarine;padding: 20px;margin-top: 20px;
}.actionContainer {padding: 15px;margin-top: 30px;
}.berryBox {background-color: darksalmon;padding: 30px;
}.berryTxt {padding-left: 80px;padding-right: 80px;padding-top: 30px;padding-bottom: 30px;margin-bottom: 35px;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98250.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用SD為VFX制作貼圖

1.制作遮罩 Gradient Linear 1 通過Blend 可以混合出不同遮罩 2.徑向漸變 Shape 節點 , 非常常用 色階調節灰度和漸變過渡 曲線能更細致調節灰度 色階還可以反向 和圓盤混合 就是 菲涅爾Fresnel 3. 屏幕后處理漸變 第二種方法 4. 極坐標 Gradient Circular Threshold 閾值節…

面經分享二:Kafka、RabbitMQ 、RocketMQ 這三中消息中間件實現原理、區別與適用場景

一、實現原理 (Implementation Principle) 1. Apache Kafka&#xff1a;分布式提交日志 (Distributed Commit Log) Kafka 的核心設計理念是作為一個分布式、高吞吐量的提交日志系統。它不追求消息的復雜路由&#xff0c;而是追求數據的快速、持久化流動。 存儲結構&#xff1a;…

Android開發——初步了解AndroidManifest.xml

Android開發——初步了解AndroidManifest.xml ? AndroidManifest.xml 是 Android 應用的清單文件&#xff0c;包含了應用的包名、組件聲明、權限聲明、API 版本信息等。它是 Android 應用的“說明書”&#xff0c;系統通過它了解應用的結構和行為。咱們的AndroidManifest文件實…

ecplise配置maven插件

1.下載maven 2.配置系統變量 MAVEN_HOME&#xff1a; E:\CODE\MAVEN\apache-maven-3.0.4 3.配置環境變量 %MAVEN_HOME%\bin 4.cmd&#xff1a;mvn -version 注1 如圖所示為&#xff1a;成功 注1&#xff1a;配置成功的前提是要有配置JAVA_HOME,如果沒有配置&#xff0c;則…

Vue 項目性能優化實戰

性能優化有一套「發現 → 定位 → 解決」的閉環方法論。本文以真實項目為藍本&#xff0c;從編碼階段到上線監控&#xff0c;給出一條可落地的 Vue 性能優化路線圖。 一、量化指標定位性能瓶頸 任何優化之前先用量化證據鎖死問題。 Lighthouse 一鍵跑分&#xff1a;首屏、交互、…

阿里云智能多模態大模型崗三面面經

阿里云智能多模態大模型崗三面面經&#xff08;詳細問題感受&#xff09; 最近面試了 阿里云智能集團 - 多模態大模型崗位&#xff0c;三輪技術面&#xff0c;整體體驗還不錯。問題整體偏常規&#xff0c;但對項目的追問比較細致。這里整理一下完整面經&#xff0c;供準備類似崗…

C++ 條件變量 通知 cv.notify_all() 先釋放鎖再通知

簡短的回答是&#xff1a;先釋放鎖&#xff0c;再通知&#xff08;notify_one 或 notify_all&#xff09;通常是更優的選擇。 雖然標準允許兩種順序&#xff0c;但“先解鎖&#xff0c;后通知”的性能通常更好。 下面我們來詳細解釋原因和兩種方式的區別。 先通知&#xff0c;后…

案例精選 | 南京交通職業技術學院安全運營服務建設標桿

導語 隨著教育信息化的深入推進&#xff0c;高校已成為數字化轉型的前沿陣地。然而&#xff0c;伴隨著教學、科研、管理等業務系統的全面上云與互聯互通&#xff0c;高校網絡環境日益復雜&#xff0c;面臨的網絡安全威脅也愈發嚴峻。勒索病毒、數據泄露、APT攻擊等安全事件頻發…

AI安全必修課:模型偏見檢測與緩解實戰

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;AI偏見——看不見的技術債務 2018年&#xff0c…

Trae + MCP : 一鍵生成專業封面

每日一句 人生只有走出來的美麗&#xff0c; 沒有等出來的輝煌。 目錄 每日一句 前言 一.核心工具與優勢解析 二.操作步驟&#xff1a;從配置到生成廣告封面 前期準備&#xff1a;確認環境與工具版本 第一步. 獲取配置代碼 第二步&#xff1a;在 Trae 中導入 MCP 配置…

Eureka與Nacos的區別-服務注冊+配置管理

Eureka與Nacos的區別-服務注冊配置管理 以下是 Eureka 和 Nacos 的核心區別對比&#xff0c;幫你清晰理解它們的不同定位和特性&#xff1a; ?1. 核心定位? ?Eureka&#xff1a;?? ?純服務注冊與發現中心&#xff0c;源自 Netflix&#xff0c;核心功能是維護服務實例清單…

這才是真正懂C/C++的人,寫代碼時怎么區分函數指針和指針函數?

1.介紹 很多初中級開發者常常在這兩個術語之間感到困惑,分不清它們的定義、語法和應用場景,從而在實際編程中埋下隱患。本文旨在撥開迷霧,從概念定義、語法解析、核心區別及實戰應用四個維度,對函數指針與指針函數進行一次全面、深入的辨析,幫助您徹底厘清這兩個概念,并…

Go基礎(④指針)

簡單示例package mainimport "fmt"func main() {var num int 100var p *int &num // 指向int類型的指針fmt.Println(*p) // 解引用&#xff0c;輸出 100*p 200 // 通過指針修改原變量fmt.Println(num) // 輸出 200 }package mainimport "fmt…

java社交小程序源碼支持APP多端springboot部署與功能模塊詳解

構建一個支持 多端訪問、實時互動、商城交易 的綜合型應用&#xff0c;已成為眾多企業和開發團隊的共同目標。由 寵友信息技術有限公司 打造的 友貓社區&#xff0c;正是基于 Spring Boot 技術棧 的全端解決方案&#xff0c;既能支持 微信小程序、APP、PC管理后臺&#xff0c;又…

代理連接性能優化:提升網絡效率的關鍵技術與實踐

在當今數字化時代&#xff0c;代理連接性能優化已成為網絡架構設計中的關鍵環節。本文將深入探討如何通過技術手段提升代理服務器的響應速度、穩定性和資源利用率&#xff0c;幫助讀者構建高效可靠的代理網絡體系。 代理連接性能優化&#xff1a;提升網絡效率的關鍵技術與實踐 …

Rust 元組

簡介 元組可以由多種類型組成&#xff0c;長度固定。 創建元組 // 固定類型 let tup1: (i32, f64, u8) (500, 8.8, 1);// 不固定類型 let tup2 (500.99, 8.8, 1, 9.99);println!("{}", tup2.0);用模式匹配解構元組 let tup (500.99, 8.8, 1, 9.99); let (x, y…

突破閉集限制:3D-MOOD 實現開集單目 3D 檢測新 SOTA

【導讀】 單目 3D 目標檢測是計算機視覺領域的熱門研究方向&#xff0c;但如何在真實復雜場景中識別“未見過”的物體&#xff0c;一直是個難題。本文介紹的 3D-MOOD 框架&#xff0c;首次提出端到端的開集單目 3D 檢測方案&#xff0c;并在多個數據集上刷新了 SOTA。 目錄 …

Python爬蟲數據清洗實戰:從雜亂無章到整潔可用

小伙伴們&#xff0c;做爬蟲最頭疼的不是抓數據&#xff0c;而是抓回來那一堆亂七八糟的內容&#xff01;價格里混著符號、日期格式千奇百怪、還有重復和缺失的值&#xff0c;看著就頭大。別慌&#xff0c;咱們用Python幾招就能搞定。Pandas處理表格數據是真香&#xff0c;正則…

打工人日報#20250906

打工人日報#20250906 周六了&#xff01; 今天出門讀者特別痛&#xff0c;本來都想爽約了&#xff0c;不過忍下來了了&#xff0c;現在看來很值得&#xff01; 不過還是要好好吃早餐、和熱水&#xff01; 閱讀 《小米創業思考》 第一章 奇跡時代 看完了 就是快呀 好的產品 好的…

小型磨床設計cad+三維圖+設計說明書

摘 要 隨著現代加工技術的發展&#xff0c;各種各樣的加工技術得到了廣泛的應用&#xff0c;磨床在機械制造領域得到了廣泛的應用&#xff0c;本文經過查閱相關文獻&#xff0c;完成了一種小型磨床的結構設計。 本文設計的小型磨床其主要是由三部分組成的&#xff0c;第一部分…