React(四):事件總線、setState的細節、PureComponent、ref

React(四)

    • 一、事件總線
    • 二、關于setState的原理
      • 1. setState的三種使用方式
        • (1)基本使用
        • (2)傳入一個回調
        • (3)第一個參數是對象,第二個參數是回調
      • 2. 為什么setState要設置成異步
        • (1)提升性能,減少render次數
        • (2)避免state和props數據不同步
      • 3. 獲取異步修改完數據的結果
    • 三、PureComponent監測數據的原理
      • 1. 先來看一個問題
      • 2. sholdComponentUpdate()
      • 3. 引出PureComponent
        • (1)類組件
        • (2)函數組件
      • 4. PureComponent只監測第一層
      • 5. PureComponent如何監測深層數據的改變
    • 四、ref獲取元素或組件實例
      • 1. ref的三種用法
      • 2. ref獲取類組件實例
      • 3. ref獲取函數組件內的某個元素

一、事件總線

這里的事件總線和vue中基本一個思路。

在React中可以通過第三方庫來進行任意組件通信,安裝:

npm install hy-event-store

使用:
在這里插入圖片描述
1、在某個地方新建jsx文件對外暴露事件總線

// 創建事件總線
import { HYEventBus } from 'hy-event-store';
const eventBus = new HYEventBus();export default eventBus;

2、在需要接收值的組件中,在掛在完畢的生命周期函數中綁定事件和被觸發時的回調,最好寫上銷毀的代碼:

//事件的回調getData(name,age) {console.log(name,age,this);this.setState({name: name, age: age})}//1.掛載完畢后綁定事件接收別的地方傳過來的值componentDidMount() {eventBus.on('getData', this.getData.bind(this))}//3.銷毀的時候解綁componentWillUnmount() {eventBus.off('getData', this.getData)}

3、另一個組件觸發,并傳值

sendData() {//2.某個組件中觸發事件并傳值eventBus.emit('getData', 'zzy', 18)}render() {return (<div><h1>GrandSon組件</h1><button onClick={() => this.sendData()}>點擊傳值給App</button></div>)}

二、關于setState的原理

開發中我們并不能直接通過修改state的值來讓界面發生更新:
因為我們修改了state之后,希望React根據最新的State來重新渲染界面,但是這種方式的修改React并不知道數據發生了變化;
React并沒有實現類似于Vue2中的Object.defineProperty或者Vue3中的Proxy的方式來通過數據劫持監聽數據的變化;
我們必須通過setState來告知React數據已經發生了變化;
源碼先簡單lou一眼:
在這里插入圖片描述

1. setState的三種使用方式

我們基于以下組件進行操作

export class Son extends React.Component {constructor() {super();this.state = {name: 'zzy',age: 18,}}changeName() {this.setState(...)}render() {return (<div><h1>{this.state.name}</h1><button onClick={() => this.changeName()}>點擊修改名字</button></div>)}
}
(1)基本使用

我們之前用的最多的就是直接傳入一個配置對象,然后給state中數據重新賦值。這里的原理是借助了Object.assign(state, newState)state和傳入的對象進行合并,如果key重復那么就進行值的覆蓋,沒改的繼續保留

//1.基本使用,傳入配置對象,不是覆蓋原來的state,而是進行對象的合并
this.setState({name: 'ht'  //原理:對象的合并Object.assign(state, newState)
})
(2)傳入一個回調

setState的參數除了可以傳配置對象外,還可以傳入一個回調函數,通過return一個對象,對象中包含我們要修改的值,也可以實現數據的更新和頁面的重新渲染。

這個回調可以接收兩個參數:state和props,分別對應的是上一個修改狀態stateprops的值們。

注意是上一個修改狀態!如果在一個回調中多次執行setState更改數據,那么參數state保存的是上一個修改狀態的值!如果不明白請看本節2.1.1部分

//2.傳入一個回調,可以接收修改之前的state和props
this.setState((state,props) => {console.log(state,props);return {name: 'ht' //這里也可以進行更改}
})
(3)第一個參數是對象,第二個參數是回調

setState是一個異步調用。

如果在setState下面使用name,我們會發現拿到的是原來的name,這就證明了setState是一個異步調用,那么如果我們想在數據變化后再基于數據進行一些操作怎么辦?這時候可以傳入第二個參數:一個回調函數,該回調函數執行的時機就是數據更新完且render調用完畢后

//3.setState是一個異步調用
//如果想等數據更新后做一些操作,可以傳入第二個參數:回調
//第二個參數執行的時機就是數據更新完之后
this.setState({ name

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

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

相關文章

CPUcores-【硬核優化】CPU增強解鎖全部內核!可優化游戲性能、提升幀數!啟用CPU全內核+超線程,以更高優先級運行游戲!支持各種游戲和應用優化~

軟件介紹&#xff08;文末獲取&#xff09;CPUCores&#xff1a;游戲性能優化利器?這款工具&#xff0c;專為優化提升中低配電腦的幀數而生。其獨創的CPU資源調度技術&#xff0c;能讓老舊硬件煥發新生核心技術原理?采用「內核級隔離」方案&#xff0c;通過&#xff1a;系統進…

HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text

文本對抗性攻擊分為白盒攻擊和黑盒攻擊&#xff0c;其中黑盒攻擊更貼近現實&#xff0c;又可分為軟標簽和硬標簽設置&#xff0c;。這些名詞分別是什么意思 在文本對抗性攻擊中&#xff0c;“白盒攻擊”“黑盒攻擊”以及黑盒攻擊下的“軟標簽”“硬標簽”設置&#xff0c;核心差…

PyCharm性能優化與大型項目管理指南

1. PyCharm性能深度調優 1.1 內存與JVM配置優化 PyCharm基于JVM運行,合理配置JVM參數可顯著提升性能: # 自定義VM選項文件位置 # Windows: %USERPROFILE%\AppData\Roaming\JetBrains\<product><version>\pycharm64.exe.vmoptions # macOS: ~/Library/Applicat…

基于Java飛算AI的Spring Boot聊天室系統全流程實戰

在當今數字化時代&#xff0c;實時通訊已成為現代應用不可或缺的核心功能。從社交平臺到企業協作&#xff0c;從在線客服到游戲互動&#xff0c;實時聊天功能正以前所未有的速度滲透到各行各業。然而&#xff0c;開發一個功能完善的聊天室系統絕非易事——傳統開發模式下&#…

在 Conda 環境下編譯 C++ 程序時報錯:version `GLIBCXX_3.4.30‘ not found

報錯信息如下 ERROR:/root/SVF/llvm-16.0.4.obj/bin/clang: /opt/miniconda3/envs/py38/lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /root/SVF/llvm-16.0.4.obj/bin/clang)根據錯誤信息&#xff0c;問題是由于 Conda 環境中的libstdc.so.6缺少GLIBCXX_3…

vue+flask基于Apriori算法規則的求職推薦系統

文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站&#xff0c;有好處&#xff01;編號&#xff1a;F069 基于Apriori關聯規則職位相似度的推薦算法進行職位推薦 基于決策樹、隨機森林的預測薪資 vueflaskmysql爬蟲 設計求…

機器學習第九課之DBSCAN算法

目錄 簡介 一、dbscan相關概念 二、dbscan的API 三、案例分析 1. 導入所需庫 2. 數據讀取與預處理 3. 數據準備 4. DBSCAN 參數調優 5. 確定最佳參數并應用 總結 簡介 本次我們將聚焦于一款極具特色的聚類算法 ——DBSCAN。相較于 K-means 等需要預先指定簇數量的算法…

給AI開一副“健忘藥”:Dropout如何治愈神經網絡的死記硬背癥

**——解讀《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》**想象一位學生備考時&#xff0c;只反復背誦三套模擬題答案&#xff0c;卻在真正的考場上面對新題型束手無策——這種**死記硬背不會舉一反三**的問題&#xff0c;正是神經網絡中的“過擬合”…

【框架】跨平臺開發框架自用整理

Tauri 2.0 | Tauri https://github.com/tauri-apps/tauri 創建小型、快速、安全、跨平臺的應用程序 獨立于前端 將你現有的網絡技術棧帶到 Tauri 或開始新的項目。 Tauri 支持任何前端框架&#xff0c;所以你不需要改變你的技術棧。 跨平臺 使用單個代碼庫為 Linux、macOS、W…

web前端第三次作業

一、作業要求&#xff1a;使用js完成抽獎項目 效果和內容自定義&#xff0c;可以模仿游戲抽獎頁面二、代碼<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…

wrap cpp variant as dll for c to use

包裝c的variant給c用 variant_wrapper.cpp #include <variant> #include <unordered_map> #include <cstring> #include <cstdio> #include <new> #include <memory> #include <functional> #include <cstdlib>// 類型ID定義 …

GraphRAG查詢(Query)流程實現原理分析

文章目錄說明一 GraphRAG查詢&#xff08;Query&#xff09;流程二 Local Search 實現原理三 Global Search 實現原理四 GraphRAG Python API使用說明 本文學自賦范社區公開課&#xff0c;僅供學習和交流使用&#xff01;本文重在介紹GraphRAG查詢流程&#xff0c;有關索引構建…

服務器的安全檢測和防御技術

1. 服務器安全風險1.1 不必要的訪問&#xff08;如只提供HTTP服務&#xff09;若服務器僅需提供 HTTP 服務&#xff0c;卻開放了其他不必要的訪問途徑&#xff0c;會增加風險。通過應用識別、控制&#xff0c;可精準識別應用類型&#xff0c;限制非必要訪問&#xff0c;保障服務…

FileLink:為企業跨網文件傳輸筑牢安全與效率基石

FileLink&#xff1a;為企業跨網文件傳輸筑牢安全與效率基石在企業數據往來日益頻繁的今天&#xff0c;跨網文件傳輸的安全性和高效性是企業順暢運營的關鍵。傳統傳輸方式在安全防護、系統融合及成本控制上的短板愈發明顯&#xff0c;而 FileLink 憑借在這些方面的突出表現&…

java設計模式之開閉原則使用舉例

1. 輸入法皮膚擴展&#xff08;抽象類實現&#xff09; 場景&#xff1a;用戶可為輸入法更換不同皮膚&#xff08;如默認皮膚、CSDN皮膚&#xff09;。 實現&#xff1a; 抽象層&#xff1a;定義抽象類AbstractSkin&#xff0c;聲明皮膚顯示方法。擴展&#xff1a;新增皮膚只需…

Spark Shuffle機制原理

文章目錄1.什么是Shuffle?2.Shuffle解決什么問題?3.Shuffle Write與Shuffle Read4.Shuffle的計算需求4.1 計算需求表4.2 partitionby4.3 groupByKey4.4 reduceByKey4.5 sortByKey5.Shuffle Write框架設計與實現5.1 Shuffle Write框架實現的功能5.2 Shuffle Write的多種情況5.…

Cursor vs Trae vs VSCode:2025終極IDE橫評,誰才是開發者的效率之選?

前言 2025年的編程世界&#xff0c;AI不再只是輔助&#xff0c;而是編程工作流的核心驅動者。從微軟的VSCode 到新銳 Cursor 與國產黑馬 Trae &#xff0c;三大 IDE 正在重新定義“人機協作”的邊界。本文從架構設計、AI能力、場景適配等維度&#xff0c;帶你看透工具本質&…

Vue 安裝指定版本依賴包、刪除某個依賴包、依賴管理

如何安裝指定版本的依賴包安裝指定版本&#xff1a;一旦你知道了想要的版本號&#xff0c;比如3.4.0&#xff0c;你可以使用以下命令來安裝這個版本的vue-router&#xff1a;npm install vue-router3.4.0 --save這里的^表示安裝3.4.0的最新小版本更新&#xff0c;但不會超過主版…

psycopg2 如何驗證鏈接是否有效

在 psycopg2 中&#xff0c;驗證數據庫連接是否有效&#xff08;即連接是否仍然活躍&#xff09;可以通過以下幾種方法實現&#xff1a;1. 使用 conn.closed 屬性 psycopg2 的連接對象有一個 closed 屬性&#xff0c;可以檢查連接是否已關閉&#xff1a; import psycopg2conn …

數據科學與計算-電商雙11美妝數據分析

一、項目背景&#xff1a;雙 11 美妝數據的價值所在 每年的 “雙 11” 購物節都是電商行業的盛宴&#xff0c;而美妝品類作為消費熱門領域&#xff0c;蘊含著豐富的用戶行為與市場趨勢信息。該項目聚焦雙 11 期間的美妝電商數據&#xff0c;旨在通過數據分析揭示以下核心問題&…