react組件渲染性能優化之函數組件-useCallback使用

useCallback主要就是對函數進行緩存,useCallBack這個Hooks主要是解決React.memo不能緩存事件的問題

useCallBack(fn, dependencies) :fn想要緩存的函數,dependencies有關是否更新 fn 的所有響應式值的一個列表

比如:UseCallBackOptimize組件傳遞了一個事件函數給ChildCom2、ChildCom3,只要其中一個子組件調用這個事件就會影響到另一個子組件重新渲染一次,React.memo可以解決傳值問題,但解決不了傳遞事件的問題。

示例:

styles.module.css

.container {width: 500px;height: 200px;border: 1px solid;margin: 0 auto;
}.btnContainer {text-align: center;
}.childComContainer {display: flex;justify-content: space-between;
}

import { useState, useCallback } from 'react'
import ChildCom2 from './components/ChildCom2'
import ChildCom3 from './components/ChildCom3'
import styles from "./styles.module.css"
export default function UseCallBackOptimize() {// 這是UseCallBackOptimize組件自身維護的狀態const [counter, setCounter] = useState(0);// 這是傳遞給ChildCom2組件的數據const [counter1, setCounter1] = useState(0);// 這是傳遞給ChildCom3組件的數據const [counter2, setCounter2] = useState(0);//之所以子組件使用了memo后都無法阻止子組件之間互相影響,是因為每次重新渲染的時候都會生成一個圈新的test函數function test() {console.log("test");}console.log("UseCallBackOptimize組件渲染了")return (<div className={styles.container}><div className={styles.btnContainer}><div>{counter}</div>{/*點擊修改數字時,ChildCom2和ChildCom3組件都會更新,原因看test上面*/}<button onClick={() => setCounter(counter + 1)}>+1</button></div><div className={styles.childComContainer}><ChildCom2 counter={counter1} setCounter={setCounter1} test={test}/><ChildCom3 counter={counter2} setCounter={setCounter2} test={test}/></div></div>);
}

import { memo } from "react"
function ChildCom2(props) {// 該子組件維護了一個自身的狀態// const [counter, setCounter] = useState(0);console.log("ChildCom2 渲染了")return (<div style={{width: "200px",height: "100px",border: "1px solid"}}>ChildCom2<div>{props.counter}</div><button onClick={() => props.setCounter(props.counter + 1)}>+1</button><button onClick={() => props.test()}>test</button></div>);
}export default memo(ChildCom2);
import { memo } from "react"
function ChildCom3(props) {// 該子組件維護了一個自身的狀態// const [counter, setCounter] = useState(0);console.log("ChildCom3 渲染了")return (<div style={{width: "200px",height: "100px",border: "1px solid"}}>ChildCom3<div>{props.counter}</div><button onClick={() => props.setCounter(props.counter + 1)}>+1</button><button onClick={() => props.test()}>test</button></div>);
}export default memo(ChildCom3);

本來調用ChildCom2的函數ChildCom3是不應該重新渲染的,使用useCallBack可以解決這個問題,兩個子組件什么都不變的

解決后示例

import { useState, useCallback } from 'react'
import ChildCom2 from './components/ChildCom2'
import ChildCom3 from './components/ChildCom3'
import styles from "./styles.module.css"
export default function UseCallBackOptimize() {// 這是UseCallBackOptimize組件自身維護的狀態const [counter, setCounter] = useState(0);// 這是傳遞給ChildCom2組件的數據const [counter1, setCounter1] = useState(0);// 這是傳遞給ChildCom3組件的數據const [counter2, setCounter2] = useState(0);//todo 之所以子組件使用了memo后都無法阻止子組件之間互相影響,是因為每次重新渲染的時候都會生成一個圈新的test函數/* function test() {console.log("test");} */// 使用了 useCallback 之后,針對test函數就做了一個緩存,如果依賴某個參數如counter,就在參數2[]里面傳入進去const newTest = useCallback(function test() {console.log("test");}, [])console.log("UseCallBackOptimize組件渲染了")return (<div className={styles.container}><div className={styles.btnContainer}><div>{counter}</div><button onClick={() => setCounter(counter + 1)}>+1</button></div><div className={styles.childComContainer}><ChildCom2 counter={counter1} setCounter={setCounter1} test={newTest}/><ChildCom3 counter={counter2} setCounter={setCounter2} test={newTest}/></div></div>);
}

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

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

相關文章

(done) NLP+HMM 協作,還有維特比算法

參考視頻&#xff1a;https://www.bilibili.com/video/BV1aP4y147gA/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;這實際上是 “序列標注任務”&#xff09; HMM 的訓練和預測如下圖 訓練過程&#xff1a;我們首先先給出一個語…

做一個桌面懸浮翻頁時鐘

毛玻璃效果翻頁桌面懸浮時鐘&#xff0c;TopMost&#xff08;Topmost“True”&#xff09;&#xff0c;不在任務欄顯示&#xff08;ShowInTaskbar“False”&#xff09;&#xff0c;在托盤區顯示圖標&#xff0c;雙擊托盤區圖標實現最小化和還原&#xff0c;右鍵托盤圖標可選“…

常見網絡攻擊及解決方案

網絡安全是開發中常常會遇到的情況&#xff0c;為什么會遇到網絡攻擊&#xff0c;網絡攻擊是如何進行的&#xff0c;如何抵御網絡攻擊&#xff0c;都是我們需要思考的問題。 為什么會遇到網絡攻擊&#xff1f; 以下是一些主要的因素&#xff1a; 技術漏洞&#xff1a;軟件或操…

web學習記錄--(5.14)

1.Sublime安裝與漢化 直接點擊windows即可下載&#xff0c;安裝即可 Thank You - Sublime Text 漢化 Install Package ChineseLocalzation 2.PHPstorm下載以及激活,漢化 直接下載&#xff0c;然后找激活碼激活即可 漢化 plugins&#xff08;插件&#xff09;/chinese&…

SpringBoot接收參數的19種方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583

未授權訪問:ZooKeeper 未授權訪問漏洞

目錄 1、漏洞原理 2、環境搭建 3、未授權訪問 防御手段 今天繼續學習各種未授權訪問的知識和相關的實操實驗&#xff0c;一共有好多篇&#xff0c;內容主要是參考先知社區的一位大佬的關于未授權訪問的好文章&#xff0c;還有其他大佬總結好的文章&#xff1a; 這里附上大…

在Ubuntu中如何解壓zip壓縮包??

2024年5月15日&#xff0c;周三上午 使用 unzip 命令 unzip 文件名.zip這會將壓縮包中的內容解壓到當前目錄。如果想解壓到特定目錄&#xff0c;可以使用 -d 選項&#xff0c;例如&#xff1a; unzip 文件名.zip -d 目標目錄使用 7-zip 還可以安裝 7-zip 工具來解壓 ZIP 文件。…

【Python探索之旅】冒泡排序(三種方法)

前言 算法步驟&#xff1a; 代碼實現 方法一、嵌套循環 方法二 while循環 方法三、使用生成器表達式 解釋&#xff1a; 時間復雜度&#xff1a; 完結撒花 前言 冒泡排序是一種簡單的排序算法&#xff0c;它也是一種穩定排序算法。其實現原理是重復掃描待排序序列&#xf…

2025年第十一屆北京國際印刷技術展覽會

2025年第十一屆北京國際印刷技術展覽會 展覽時間&#xff1a;2025年5月15-19日 展覽地點&#xff1a;北京中國國際展覽中心&#xff08;順義館&#xff09; 主辦單位&#xff1a;中國印刷及設備器材工業協會中國國際展覽中心集團有限公司 承辦單位&#xff1a;北京中印協華港國…

海思Hi3065H 200MHz 高性能 RISCV32 A2 MCU

這是一款海思自研的RISCV32內核的高性能實時控制專用MCU&#xff0c; 具有高性能、高集成度、高可靠性、易開發的特點&#xff0c;同時還有嵌入式AI能力。 CPU ? RISC-V200MHzFPU 存儲 ? Up to 152KB Code Flash ? 8KB Data Flash ? 16KB SRAM 個人認為這是MCU梯隊非常…

[Linux][網絡][高級IO][IO多路轉接][select][poll]詳細講解

目錄 1.IO多路轉接之select1.初識select2.select()3.關于fd_set結構4.關于timeval結構5.理解select執行過程6.select就緒條件7.select特點8.select優點(任何一個多路轉接方案&#xff0c;都具備)9.select缺點10.select的一般編寫代碼的模式11.思考 && 問題 2.IO多路轉接…

【PB案例學習筆記】-02 目錄瀏覽器

寫在前面 這是PB案例學習筆記系列文章的第二篇&#xff0c;該系列文章適合具有一定PB基礎的讀者&#xff0c; 通過一個個由淺入深的編程實戰案例學習&#xff0c;提高編程技巧&#xff0c;以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼&#xff0c;小凡都上…

基于Django實現的(bert)深度學習文本相似度檢測系統設計

基于Django實現的&#xff08;bert&#xff09;深度學習文本相似度檢測系統設計 開發語言:Python 數據庫&#xff1a;MySQL所用到的知識&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系統功能實現 登錄頁面 注冊頁面&#xff1a;用戶賬號&#xff0c;密碼…

05-14 周二 PyTorch動態量化和靜態量化理解

05-14 周二 PyTorch動態量化和靜態量化理解 時間版本修改人描述2024年5月14日10:44:30V0.1宋全恒新建文檔2024年5月14日16:28:16V1.0宋全恒填充了PyTorch對于兩種量化方式的內容 簡介 Pytorch動態量化 設計神經網絡時&#xff0c;可以進行許多權衡。在模型開發和訓練期間&…

Dilworth定理:最少的下降序列個數就等于整個序列最長上升子序列的長度

概念如下&#xff1a; 狄爾沃斯定理_百度百科 (baidu.com) 本質就是找要求序列中最長的單調的子序列&#xff08;不一定連續&#xff09;的長度。 模板如下&#xff1a; 時間復雜度為O&#xff08;N^2&#xff09; #include<iostream>using namespace std;int dp[100…

RK3568平臺開發系列講解(SPI篇)SPI數據的傳輸

??返回專欄總目錄 文章目錄 一、數據結構1.1、spi_transfer 結構體1.2、spi_message二、數據發送程序分析沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 參考資料: spi_transferspi_message一、數據結構 spi 數據傳輸主要使用了 spi_message 和 spi_transfer 結構…

二叉樹的前序遍歷(leetcode)

144. 二叉樹的前序遍歷 - 力扣&#xff08;LeetCode&#xff09; 給你二叉樹的根節點 root &#xff0c;返回它節點值的 前序 遍歷。 這道題的啟發性真的很強 &#xff0c;這里必須傳入i的指針進去&#xff0c;下一次棧幀i&#xff0c;但回到了上一層i又變回到了原來的i&#…

docker network ls(用于列出 Docker 主機上的所有網絡)

docker network ls 是一個 Docker 命令&#xff0c;用于列出 Docker 主機上的所有網絡。Docker 允許你創建自定義的網絡&#xff0c;以便更好地控制容器之間的通信。 當你運行 docker network ls 命令時&#xff0c;你可能會看到如下類似的輸出&#xff08;輸出可能會根據你的…

每日一題12:Pandas:數據重塑-融合

一、每日一題 解答&#xff1a; import pandas as pddef meltTable(report: pd.DataFrame) -> pd.DataFrame:reshaped_report report.melt(id_varsproduct, var_namequarter, value_namesales)return reshaped_report 題源&#xff1a;Leetcode 二、總結 melt()函數是Pa…

Nginx生產環境最佳實踐之配置灰度環境

你好呀&#xff0c;我是趙興晨&#xff0c;文科程序員。 下面的內容可以說是干貨滿滿建議先收藏再慢慢細品。 今天&#xff0c;我想與大家深入探討一個我們日常工作中不可或缺的話題——灰度環境。你是否在工作中使用過灰度環境&#xff1f;如果是&#xff0c;你的使用體驗如…