React---day6、7

article/2025/7/12 18:52:50

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.hkcw.cn/article/CFLKevXBCi.shtml

相关文章

LLM模型量化从入门到精通:Shrink, Speed, Repeat

前言 神经网络把它们的知识都存成数字啦&#xff0c;主要是训练时学到的权重&#xff0c;还有运行时在每一层流动的激活值。这些数字必须保持在一个固定的数值格式里&#xff0c;而选的格式就决定了每个参数要占多少内存。要是用默认的32位浮点表示&#xff0c;一个有70亿参数…

PHP舆情监控分析系统(9个平台)

PHP舆情监控分析系统&#xff08;9个平台&#xff09; 项目简介 基于多平台热点API接口的PHP实时舆情监控分析系统&#xff0c;无需数据库&#xff0c;直接调用API实时获取各大平台热点新闻&#xff0c;支持数据采集、搜索和可视化展示。 功能特性 &#x1f504; 实时监控 …

贪心算法应用:多重背包启发式问题详解

贪心算法应用&#xff1a;多重背包启发式问题详解 多重背包问题是经典的组合优化问题&#xff0c;也是贪心算法的重要应用场景。本文将全面深入地探讨Java中如何利用贪心算法解决多重背包问题。 多重背包问题定义 **多重背包问题(Multiple Knapsack Problem)**是背包问题的变…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月2日第96弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…

布隆过滤器

文章目录 布隆过滤器&#xff08;Bloom Filter&#xff09;详解&#xff1a;原理、实现与应用场景一、引言二、布隆过滤器的基本原理1. 数据结构2. 插入操作3. 查询操作4. 误判率 三、布隆过滤器的实现四、布隆过滤器的应用场景1. 网络爬虫2. 缓存穿透防护3. 垃圾邮件过滤4. 分…

给stm32cubeide编译出来的bin文件追加crc32

在工程目录下创建ci目录&#xff0c;将AddCrc32.exe丢进去&#xff0c;在stm32cubeide的properties----C/C Build----Settings----Build Steps----Post-build steps Command:添加AddCrc32.exe的路径: source code如下&#xff1a; #include <stdio.h> #include <stdl…

算法-集合的使用

1、set常用操作 set<int> q; //以int型为例 默认按键值升序 set<int,greater<int>> p; //降序排列 int x; q.insert(x); //将x插入q中 q.erase(x); //删除q中的x元素,返回0或1,0表示set中不存在x q.clear(); //清空q q.empty(); //判断q是否为空&a…

网络地址转换

网络地址转换 网络地址转换(Network Address Translation&#xff0c;NAT)的功能是将企业内部自行定义的私有IP地址转换为Internet上可识别的合法IP地址。由于现行IP地址标准--IPv4的限制&#xff0c;Internet面临着IP地址空间短缺的问题&#xff0c;因此从ISP申请并给企业的每…

4.大语言模型预备数学知识

大语言模型预备数学知识 复习一下在大语言模型中用到的矩阵和向量的运算&#xff0c;及概率统计和神经网络中常用概念。 矩阵的运算 矩阵 矩阵加减法 条件&#xff1a;行数列数相同的矩阵才能做矩阵加减法 数值与矩阵的乘除法 矩阵乘法 条件&#xff1a;矩阵A的列数 矩阵…

leetcode hot100刷题日记——35.子集

解答&#xff1a; 方法一&#xff1a;选or不选的dfs&#xff08;输入视角&#xff09; 思路&#xff1a;[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选&#xff0c;[1,2]就是1&#xff0c;2选&#xff0c;3不选。 class Solution { pub…

【数据库】关系数据库标准语言-SQL(金仓)下

4、数据查询 语法&#xff1a; SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <…

好用的C/C++/嵌入式 IDE: CLion的下载安装教程(保姆级教程)

CLion简介 CLion是由著名的JetBrains公司开发出的一个C/C的IDE。它原是付费软件&#xff0c;但在最近(指2025年5月)开放了非商业用途免费&#xff0c;就像WebStorm、Rider、RustRover等。 除了这些&#xff0c;JetBrains的IntelliJ IDEA(社区版)和PyCharm(社区版)也是免费的。…

SpringBoot统一功能处理

1.拦截器 拦截器是Spring框架提供的核心功能之一,主要是用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的…

prometheus v3.4.1正式发布!解析全新特性与安装指南,打造高效云原生监控体系

一、引言 随着云原生时代的快速发展&#xff0c;监控系统成为保障业务平稳运行的核心利器。作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;旗下的开源监控项目&#xff0c;Prometheus凭借其卓越的多维数据模型、灵活强大的查询语言及自主运行的架构设计&a…

PCA(K-L变换)人脸识别(python实现)

数据集分析 ORL数据集&#xff0c; 总共40个人&#xff0c;每个人拍摄10张人脸照片 照片格式为灰度图像&#xff0c;尺寸112 * 92 特点&#xff1a; 图像质量高&#xff0c;无需灰度运算、去噪等预处理 人脸已经位于图像正中央&#xff0c;但部分图像角度倾斜&#xff08;可…

资源预加载+懒加载组合拳:从I/O拖慢到首帧渲染的全面优化方案

简介 在移动应用开发领域,首帧渲染性能已成为用户体验的关键指标之一。根据2025年最新行业数据,首屏加载时间每延迟1秒,用户跳出率可能增加32%,直接影响应用评分和留存率。当应用启动时,布局解析、图片解码等I/O操作往往成为首帧渲染的主要瓶颈,导致用户看到白屏或黑屏时…

【Doris基础】Apache Doris中的Coordinator节点作用详解

目录 1 Doris架构概述 2 Coordinator节点的核心作用 2.1 查询协调与调度 2.2 执行计划生成与优化 2.3 资源管理与负载均衡 2.4 容错与故障恢复 3 Coordinator节点的关键实现机制 3.1 两阶段执行模型 3.2 流水线执行引擎 3.3 分布式事务管理 4 Coordinator节点的高可…

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)

1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了&#xff0c; 生成的jar在这个目录下 3.右击&#xff0c;点击“复制路径/引用”&#xff0c;即可获得“绝对路径”、“根路径”等相关信息

id()函数:窥探Python变量内存地址的奥秘

在Python程序设计中&#xff0c;变量、对象和内存是紧密相连的核心概念。理解变量的内存地址&#xff0c;是理解Python变量本质、内存管理与性能优化的关键。Python内置函数id()&#xff0c;作为变量与对象身份&#xff08;identity&#xff09;的“指纹识别器”&#xff0c;为…

MySQL中的事务

事物特性 原子性:事物时最小的执行单位&#xff0c;不允许分割。事物的原子性确保动作要么全部完成&#xff0c;要么完全不起作用&#xff0c;如果在执行过程中发生错误&#xff0c;会被回滚到事物开始前的状态&#xff0c;就像这个事务从来没有执行过一样。一致性&#xff1a…