react相關hooks(二)

不寫性能優化的時候

const Child = (props) => {console.log(child function is recalled)// count1改變時多次執行return (<div><h1>{ props.count2}</h1></div>)
}
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child count2={count2}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}
root.render(<App />)

memo

const Child = memo((props) => {console.log(child function is recalled)// count1改變時不會多次執行return (<div><h1>{ props.count2}</h1></div>)
})
/*** * 函數組件最大的弱點:渲染執行* 當一個組建的狀態發生了改變的時候 相關視圖是必然要更新的* 函數組件在視圖更新的需求來臨的時候 函數是必然要執行的*/
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child count2={count2}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}
root.render(<App />)

useMemo

/***  memo會對引用進行比較,這種比較時淺比較,* 	如果更新了一個新的引用,那么child就會被執行*  count1更新 app重新執行 child 必然要重新賦值一個新引用*/
const Child = memo((props) => {console.log(child function is recalled)// count1改變時會多次執行return (<div><h1>{ props.childData.count2}</h1></div>)
})
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)const childData = {count2}return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}
const Child = memo(props) => {console.log(child function is recalled)// count1改變時不會多次執行return (<div><h1>{ props.childData.count2}</h1></div>)
}
function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)// const childData = {// 	count2// }// 只有依賴變了才會返回新的引用// 不是為了子組件/返回常量的時候,不需要使用useMemoconst childData = useMemo(() => ({count2}),[count2])/*** const newCount1 = useMemo(()=>count1*2,[count1])* 類似vue計算屬性 可以使用useMemo*/return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData}/><button onClick={()=> setCount2(count2+1)}>+</button></div>)
}

useCallback

const Child = memo(props) => {console.log(child function is recalled)// count1改變時會多次執行return (<div><h1>{props.childData.count2}</h1><button onClick={props.setCount2}>+</button></div>)
}function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)const cbSetCount2 = () => {() => setCount2(count2 + 1);}return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData} setCount2={cbSetCount2 } /></div>)
}
const Child = memo(props) => {console.log(child function is recalled)// count1改變時不會多次執行return (<div><h1>{props.childData.count2}</h1><button onClick={props.setCount2}>+</button></div>)
}function app () {const [count1.setCount1] = useState(0)const [count2.setCount2] = useState(0)// 函數是靜態的 一般情況下是不會增加依賴的 除非是用戶配置 比如面向對象 在this上增加函數 prototype上增加函數const cbSetCount2 = useCallback(() => {() => setCount2(count2 + 1);},[])return (<div><h1>count1:{count1}</h1><button onClick={()=> setCount1(count1+1)}>+</button><Child childData={childData} setCount2={cbSetCount2 } /></div>)
}

memo手寫

const { component } = React;
export default class PureComponent extends Component {// 如果你需要自定義shouldComponentUpdate 那么就不能繼承pureComponent(pureComponent字段該函數)// 該函數無法鑒定動態的變化shouldComponentUpdate (nextProps, nextState) { return !shallowEqual(this.props,nextProps) ||!shallowEqual(this.state,nextState)}
}function shallowEqual (o1, o2) {// 組件不能調用render函數if (o1 === o2) return true;if (typeof o1 !== 'object' || o1 === null || typeof o2 !== 'object' || o2 === null) {return false;}const k1 = Object.keys(o1);const k2 = Object.keys(o2);if (k1.length !== k2.length) return false;for (const k of k1) {if (!o2.hasOwnProperty(k) || o1[k] !== o2[k]) {return false;}}return true;
}
export function memo (Fc) {return class extends PureComponent{return () {return Fc(this.props)}}
}
useMemo
function useMemo(cb,depArr){if (memoArr[memoIndex]) {const [_memo, _dep] = memoArr[memoIndex]const isFullySame = depArr.every((dep, index) => dep === _dep[index]);if (isFullySame) { memoIndex++;return _memo;} else {return setNewMemo(cb,depArr)}} else {return setNewMemo(cb,depArr)}function setNewMemo (cb, depArr) {const memo = cb();memoArr[memoIndex++] = [memo, depArr]return memo;}
}useCallback
function useCallback(cb,depArr){if (callbackArr[callbackIndex]) {const [_callback, _dep] = callbackArr[callbackIndex]const isFullySame = depArr.every((dep, index) => dep === _dep[index]);if (isFullySame) { callbackIndex++;return _callback;} else {return setNewCallback(cb,depArr)}} else {return setNewCallback(cb,depArr)}function setNewCallback (cb, depArr) {callbackArr[callbackIndex++] = [cb,depArr]}
}

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

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

相關文章

ESP8266模塊(CH340)零基礎實戰

USB數據線連接ESP8266模塊到電腦 先按住FLASH鍵,再按一下RST鍵,然后松開 此時電腦可識別出CH340 COM接口 CH340芯片廠商網址: wch.cn 傳輸比特率9600 win11自帶驅動 下載Arduino IDE

一文了解什么是Selenium自動化測試?

一、Selenium是什么&#xff1f; 用官網的一句話來講&#xff1a;Selenium automates browsers. Thats it&#xff01;簡單來講&#xff0c;Selenium是一個用于Web應用程序自動化測試工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作瀏覽器一樣。支持的瀏…

【美賽指南】新手小白必備參賽指南

美賽指南 一、2024美賽安排二、題目類型三、選題建議四、美賽前期準備五、常用算法 一、2024美賽安排 報名截至時間&#xff1a;2024年 2月2日 00&#xff1a;00 比賽時間&#xff1a;2024年 2月2日 6&#xff1a;00- 2月6日 9&#xff1a;00 提交截至日期&#xff1a;2024年2…

嵌入式系統復習--概述

文章目錄 基本概念嵌入式系統的組成結構嵌入式操作系統嵌入式軟件開發環境硬件基礎簡介下一篇 基本概念 嵌入式計算機&#xff1a;把嵌入到對象體系中、實現對象體系智能化控制的帶有微控制器的計算機&#xff0c;稱作嵌入式計算機 嵌入式系統&#xff1a;以應用為中心&#…

harmonyOS學習筆記之@Provide裝飾器和@Consume裝飾器

Provide和Consume&#xff0c;應用于與后代組件的雙向數據同步&#xff0c;應用于狀態數據在多個層級之間傳遞的場景。不同于State/Link裝飾器修飾的 父子組件之間通過命名參數機制傳遞&#xff0c;Provide和Consume擺脫參數傳遞機制的束縛&#xff0c;實現跨層級傳遞。 其中Pr…

基于Java的招聘系統的設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#xff1a;是 目錄…

OWASP Web 安全測試指南 WSTG

Eoin Keary的前言 軟件不安全的問題可能是我們這個時代最重要的技術挑戰。支持業務、社交網絡等的 Web 應用程序的急劇興起只會加劇建立一種強大的方法來編寫和保護我們的 Internet、Web 應用程序和數據的要求。 在開放 Web 應用程序安全項目 &#xff08;OWASP&#xff09; 中…

HarmonyOS應用開發-手寫板

這是一個基于HarmonyOS做的一個手寫板應用&#xff0c;只需要簡單的幾十行代碼&#xff0c;就可以實現如下手寫功能以及清空畫布功能。 一、先上效果圖&#xff1a; 二、上代碼 Entry Component struct Index {//手寫路徑State pathCommands: string ;build() {Column() {//…

4-二分-索引二分-搜索旋轉排序數組 II

這是索引二分的第四篇算法&#xff0c;力扣鏈接 已知存在一個按非降序排列的整數數組 nums &#xff0c;數組中的值不必互不相同。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了 旋轉 &#xff0c;使數…

RocketMQ-源碼架構

源碼環境搭建 1、主要功能模塊 RocketMQ官方Git倉庫地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. RocketMQ的官方網站下載&#xff1a;下載 | R…

現在多種數據庫的讀寫模型對比

目錄 mongDB read write ES read write MySql write 總結 mongDB 3.0 版本后的WiredTiger存儲引擎 read 1. 應用通過driver 發起Buffer I/O讀操作&#xff0c;由操作系統將磁盤數據頁加載到文件系統的頁緩存區 2. 引擎層讀取頁緩沖區的數據&#xff0c;進行解壓后放…

C++STL算法庫中謂詞的使用

什么是c的謂詞 謂詞概念&#xff1a; 謂詞函數是一個判斷式&#xff0c;一個返回bool值的函數或者仿函數&#xff0c;有幾個入參就是幾元謂詞。一般做一個函數的參數使用【引用自百度百科】。 常見的可以作為謂詞的東西&#xff1a;函數、函數指針、函數對象、lambda表達式&am…

2023 年浙江省職業院校技能大賽信息安全管理與評估賽項規程

*2023 年浙江省職業院校技能大賽“高職組”* *“信息安全管理與評估”賽項規程* *一、賽項名稱* 賽項名稱&#xff1a;信息安全管理與評估 英文名稱&#xff1a;Information Security Management and Evaluation 賽項組別&#xff1a;高職 賽項歸屬產業&#xff1a;電子信…

熱電廠發電機組常見故障及預測性維護方法

熱電廠的發電機組是關鍵的能源生產設備&#xff0c;在電力供應中扮演著關鍵角色。但經過長期運行和高負荷工作&#xff0c;一旦發生故障&#xff0c;可能導致停機、設備損壞甚至引發嚴重事故。因此&#xff0c;實施有效的預測性維護方法對于確保發電機組的穩定運行至關重要。本…

Linux(17):認識與分析登錄檔

什么是登錄檔 【詳細而確實的分析以及備份系統的登錄文件】是一個系統管理員應該要進行的任務之一。 登錄檔 就是記錄系統活動信息的幾個文件&#xff0c;例如&#xff1a;何時、何地(來源IP)、何人(什么服務名稱)、做了什么動作(訊息登錄啰)。 換句話說就是&#xff1a;記錄系…

【MySQL】:表的操作

表的操作 一.創建表二.查看表結構三.修改表四.刪除表 一.創建表 field 表示列名。 datatype 表示列的類型。 character set 字符集&#xff0c;如果沒有指定字符集&#xff0c;則以所在數據庫的字符集為準。 collate 校驗規則&#xff0c;如果沒有指定校驗規則&#xff0c;則以…

MySQL系列(二)——日志篇

MySQL日志 主要包括錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志幾大類。其中&#xff0c;比較重要的還要屬二進制日志binlog&#xff08;歸檔日志&#xff09;和事務日志redo log&#xff08;重做日志&#xff09;和undo log&#xff08;回滾日志&#xff09;。 今…

windows批處理腳本(.bat)如何激活Anconda Prompt虛擬環境

通過call 來調用激活腳本&#xff0c; activate myenv指的是要激活的環境&#xff0c;若省略&#xff0c;則激活的是base環境。 call : 從另一個批處理程序調用一個批處理程序&#xff0c;而不停止父批處理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…

fastdds共享內存實現原理

fastdds 共享內存分兩個部分&#xff0c;一部分用于保存數據&#xff0c;一部分用于通信。 fastrtps_“UUID”:共享內存包括又兩部分數據&#xff0c;BufferNode和segment_size, 用配置文件port_queue_capacity_指定BufferNode的數量&#xff0c;segment_size用于保存實際傳輸的…

imp導入數據發現的

遷移歷史數據到歷史庫&#xff0c;因為災備數據中心使用的DG&#xff0c;無法使用數據泵&#xff0c;只能通過exp導出&#xff0c;然后再通過imp導入 為防止undo表空間壓力過大&#xff0c;在導入時imp使用了commit參數及buffer參數 這次導入數據量達到1TB&#xff0c;剛到了1/…