React---day6、7

6、組件之間進行數據傳遞

**6.1 父傳子:**props傳遞屬性

父組件:

 <div><ChildCpn name="蔣乙菥" age="18" height="1,88" />
</div>

子組件:

export class ChildCpn extends React.Component{render(){const {name , age , height} = this.propsreturn (<div><h2>{"姓名" + name + "," + "年齡" + age + "身高" + height}</h2></div>)}}

**6.2 子傳父:**父組件定義函數,子組件調用函數

父組件:

  <BtnCpn addNum={this.addNum.bind(this)}/>addNum() {this.setState({num : this.state.num + 1})}

子組件:

import React from "react";export class BtnCpn extends React.Component{render(){const { addNum } = this.propsreturn (<div onClick={addNum}>+1</div>)}
}

但是我們也出現了this的綁定問題:

        子傳父通信.js:22 Uncaught TypeError: Cannot read properties of undefined (reading 'setState')at addNum (子傳父通信.js:22:1)

nind綁定

     <BtnCpn addNum={this.addNum.bind(this)}/>

箭頭函數:

      addNumTwo = () =>  {this.setState({num : this.state.num + 1})//箭頭函數}

6.3 階段案例

由兩部分組成:tabBar以及父組件

父組件傳遞數據給子組件,點擊子組件,傳遞數據給父組件,切換內容

App.js

import React from "react";
import { TabBar } from "./tabBar";
export class App extends React.Component{constructor(){super();this.state =  {tabList : ["流行" , "新款" , "精選"],context : "流行",curIndex: 0}}render(){return (<div className="content"><TabBar clickItem={this.handleTabClick}curIndex={this.state.curIndex}tabList={this.state.tabList} /><h2>{this.state.context}</h2></div>)}handleTabClick = (index) => {this.setState({curIndex: index,context: this.state.tabList[index]});//更改的函數}}

tabBar

import React from "react";
export class TabBar extends React.Component{render(){const {tabList  , curIndex , clickItem } = this.props;return (<ul className="tab">{tabList.map((item, index) => (<likey={index}className={`item${curIndex === index ? ' active' : ''}`}onClick={() => clickItem(index)}>{item}</li>))}</ul>)}
}

6.4 跨組件通信

context相關的api

  1. React.createContext

用于創建一個 Context 對象。當 React 渲染一個訂閱了這個 Context 的組件時,它會從組件樹中最近的 Provider 中讀取當前的 context 值。

  1. Context.Provider

每個 Context 對象都會有一個 Provider React 組件,它允許消費組件訂閱 context 的變化。

  1. Class.contextType

用于 class 組件中訂閱 Context,只有當組件中使用了 contextType,組件才會訂閱 Context 的變化。

  1. Context.Consumer

用于函數式組件中訂閱 Context。它允許你訂閱 context 的變化,并在 context 發生變化時重新渲染組件。

  1. useContext Hook

用于函數式組件中訂閱 Context。它接收一個 context 對象(從 React.createContext 創建)并返回該 context 的當前值。

實例:

import React, { createContext, useContext } from 'react';// 創建一個 Context 對象
const ThemeContext = createContext('light');// 一個函數式組件,使用 useContext 訂閱 Context
function ThemedButton() {const theme = useContext(ThemeContext);return <button style={{ background: theme === 'dark' ? 'black' : 'white', color: theme === 'dark' ? 'white' : 'black' }}>I am styled by theme!</button>;
}// 一個中間組件
function Toolbar() {return (<ThemedButton />);
}// 應用程序的頂層組件
function App() {return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);
}export default App;

7、slot插槽

其實也算是傳參數叭,只是參數是html表達式

App.js

      <NavBar2 leftSlot={<span>aaa</span>} centerSlot={<span>bbb</span>}rightSlot={<span>ccc</span>}/>

NavBar2:

export class NavBar2 extends React.Component {render() {const {leftSlot , centerSlot , rightSlot } = this.props;return (<div className="main"><div className="bay-left">{leftSlot}</div><div className="bay-mid">{centerSlot}</div><div className="bay-right">{rightSlot}</div></div>)}
}

8、setState

8.1 為什么要使用setState?

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

8.2 為什么可以直接this.setState

setState方法是從Component中繼承過來的。

在這里插入圖片描述

8.3 為什么setState是異步的

  • setState設計為異步,可以顯著的提升性能;
    • 如果每次調用 setState都進行一次更新,那么意味著render函數會被頻繁調用,界面重新渲染,這樣效率是很低的;
    • 最好的辦法應該是獲取到多個更新,之后進行批量更新;
  • 如果同步更新了state,但是還沒有執行render函數,那么state和props不能保持同步;
    • ? state和props不能保持一致性,會在開發中產生很多的問題;

8.4 setState一定是異步的嗎

  • 在組件生命周期或React合成事件中,setState是異步;
  • 在setTimeout或者原生dom事件中,setState是同步

8.5 數據的合并

當this.state里面有兩個屬性:name、title

我們修改只修改name,那么title會不會受到影響呢?答案是不會

源碼中其實是有對 原對象 和 新對象進行合并的:

Object.assign

setState可以傳入參數或者是函數:

傳入參數:數據會進行合并,多個setSEtate合并更新為1個

傳入函數:數據不會進行合并

在這里插入圖片描述

最后會+3

9、React的更新流程

在這里插入圖片描述

更新優化的方法:

9.1 對比不同類型的元素

當節點為不同的元素,React會拆卸原有的樹,并且建立起新的樹:

  • 當一個元素從 變成 ,從
    變成 ,或從 變成
    都會觸發一個完整的重建流程;

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

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

相關文章

Windows上用FFmpeg采集攝像頭推流 → MediaMTX服務器轉發流 → WSL2上拉流播放

1. Windows上 FFmpeg 推流&#xff08;攝像頭采集&#xff09; 設備名稱可用 ffmpeg -list_devices true -f dshow -i dummy 查詢&#xff0c;假設為Integrated Camera 采集推流示例&#xff08;推RTMP到MediaMTX&#xff09;&#xff1a; ffmpeg -rtbufsize 100M -f dshow …

SpringBoot1--簡單體驗

1 Helloworld 打開&#xff1a;https://start.spring.io/ 選擇maven配置。增加SpringWeb的依賴。 Generate之后解壓&#xff0c;代碼大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

MATLAB 中調整超參數的系統性方法

在深度學習中&#xff0c;超參數調整是提升模型性能的關鍵環節。以下是 MATLAB 中調整超參數的系統性方法&#xff0c;涵蓋核心參數、優化策略及實戰案例&#xff1a; 一、關鍵超參數及其影響 超參數作用典型范圍學習率 (Learning Rate)控制參數更新步長&#xff0c;影響收斂…

根目錄0xa0屬性對應的Ntfs!_SCB中的FileObject是什么時候被建立的----NTFS源代碼分析--重要

根目錄0xa0屬性對應的Ntfs!_SCB中的FileObject是什么時候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…

(二)stm32使用4g模塊(移遠ec800k)連接mqtt

下面代碼是隨手寫的&#xff0c;沒有嚴謹測試僅供參考測試 uint8_t msgBuf[200]{"msg from mcu"}; uint8_t txBuf[250]{0}; uint16_t msgid0; uint16_t mqttTaskState0; uint16_t t100msCount0; uint8_t sendFlag10; uint8_t sendFlag20; void t100msTask1(void) { …

哈希表入門:用 C 語言實現簡單哈希表(開放尋址法解決沖突)

目錄 一、引言 二、代碼結構與核心概念解析 1. 數據結構定義 2. 初始化函數 initList 3. 哈希函數 hash 4. 插入函數 put&#xff08;核心邏輯&#xff09; 開放尋址法詳解&#xff1a; 三、主函數驗證與運行結果 1. 測試邏輯 2. 運行結果分析 四、完整代碼 五、優…

Windows下運行Redis并設置為開機自啟的服務

下載Redis-Windows 點擊redis-windows-7.4.0下載鏈接下載Redis 解壓之后得到如下文件 右鍵install_redis.cmd文件&#xff0c;選擇在記事本中編輯。 將這里改為redis.windows.conf后保存&#xff0c;退出記事本&#xff0c;右鍵后選擇以管理員身份運行。 在任務管理器中能夠…

2025年ESWA SCI1區TOP,改進成吉思汗鯊魚算法MGKSO+肝癌疾病預測,深度解析+性能實測

目錄 1.摘要2.成吉思汗鯊魚優化算法GKSO原理3.MGKSO4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流 1.摘要 本文針對肝癌&#xff08;HCC&#xff09;早期診斷難題&#xff0c;提出了一種基于改進成吉思汗鯊魚優化算法&#xff08;MGKSO&#xff09;的計算機輔助診…

李沐-動手學深度學習:RNN

1.RNN從零開始實現 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l#8.3.4節 #batch_size&#xff1a;每個小批量中子序列樣本的數目&#xff0c;num_steps&#xff1a;每個子序列中預定義的時間步數 #loa…

【C++ Qt】多元素控件(ListWidget、TableWidget、TreeWidget)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章將通過代碼示例詳細介紹了Qt中QListWidget、QTableWidget和QTreeWidget三種多元素控件的使用方法與核心功能&#xff0c;涵蓋列表的增刪操作、表格…

基于TI DSP控制的光伏逆變器最大功率跟蹤mppt

基于TI DSP&#xff08;如TMS320F28335&#xff09;控制的光伏逆變器最大功率跟蹤&#xff08;MPPT&#xff09;程序通常涉及以下幾個關鍵部分&#xff1a;硬件電路設計、MPPT算法實現、以及DSP的編程。以下是基于TI DSP的光伏逆變器MPPT程序的一個示例&#xff0c;主要采用擾動…

Python實現P-PSO優化算法優化卷積神經網絡CNN回歸模型項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔&#xff09;&#xff0c;如需數據代碼文檔可以直接到文章最后關注獲取。 1.項目背景 隨著人工智能和深度學習技術的快速發展&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;在圖像分類、目標檢測…

計算機視覺入門:OpenCV與YOLO目標檢測

計算機視覺入門&#xff1a;OpenCV與YOLO目標檢測 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 計算機視覺入門&#xff1a;OpenCV與YOLO目標檢測摘要引言技術原理對比1. OpenCV&#xff1a;傳統圖像處理與機器學…

【PCB工藝】繪制原理圖 + PCB設計大綱:最小核心板STM32F103ZET6

繪制原理圖和PCB布線之間的聯系,在繪制原理圖的時候,考慮到后續的PCB設計+嵌入式軟件代碼的業務邏輯,需要在繪制原理圖之初涉及到 硬件設計流程的前期規劃。在嵌入式系統開發中,原理圖設計是整個項目的基礎,直接影響到后續的: PCB 布線效率和質量 ☆☆☆重點嵌入式軟件的…

Centos系統搭建主備DNS服務

目錄 一、主DNS服務器配置 1.安裝 BIND 軟件包 2.配置主配置文件 3.創建正向區域文件 4.創建區域數據文件 5.檢查配置語法并重啟服務 二、從DNS服務配置 1.安裝 BIND 軟件包 2.配置主配置文件 3.創建緩存目錄 4.啟動并設置開機自啟 一、主DNS服務器配置 1.安裝 BIN…

LeetCode[513]找樹左下角的值

思路&#xff1a; 找樹左下角的值&#xff0c;有可能這個值不是左葉子節點&#xff0c;可能是右葉子節點&#xff0c;但怎么說這個值都是葉子節點&#xff0c;首先這道題用層序遍歷的思路比如什么隊列和BSF的遞歸都可以做&#xff0c;但我比較喜歡用純遞歸來搞&#xff0c;因為…

ubuntu20.04.5--arm64版上使用node集成java

ubuntu20.04.5arm上使用node集成java #ssh&#xff0c;可選 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墻相關&#xff0c;可選 sudo ufw allow ssh sudo ufw allow 22…

更新 Docker 容器中的某一個文件

&#x1f504; 如何更新 Docker 容器中的某一個文件 以下是幾種在 Docker 中更新單個文件的常用方法&#xff0c;適用于不同場景。 ? 方法一&#xff1a;使用 docker cp 拷貝文件到容器中&#xff08;最簡單&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…

JavaEE->多線程:定時器

定時器 約定一個時間&#xff0c;時間到了&#xff0c;執行某個代碼邏輯&#xff08;進行網絡通信時常見&#xff09; 客戶端給服務器發送請求 之后就需要等待 服務器的響應&#xff0c;客戶端不可能無限的等&#xff0c;需要一個最大的期限。這里“等待的最大時間”可以用定時…

html基礎01:前端基礎知識學習

html基礎01&#xff1a;前端基礎知識學習 1.個人建立打造 -- 之前知識的小總結1.1個人簡歷展示1.2簡歷信息填寫頁面 1.個人建立打造 – 之前知識的小總結 1.1個人簡歷展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…