React---day6、7

news2025/6/5 8:13:49

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.props
       return (
         <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.props
        return (
            <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) => (
                        <li
                            key={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.coloradmin.cn/o/2397451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hook组件-useEffect、useRef

hook组件-useEffect、useRef useEffect 用法及执行机制 WillMount -> render -> DidMount ShouldUpdate -> WillUpdate -> render -> DidUpdate WillUnmount(只有这个安全) WillReceiveProps useEffect(callback) 默认所有依赖都更新useEffect(callback, [])&am…

随机游动算法解决kSAT问题

input&#xff1a;n个变量的k-CNF公式 ouput&#xff1a;该公式的一组满足赋值或宣布没有满足赋值 算法步骤&#xff1a; 随机均匀地初始化赋值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a∈{0,1}n.重复t次&#xff08;后面会估计这个t&#xff09;&#xff1a; a. 如果在当前赋值下…

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购&#xff1a;PC时代的辉煌 1.1 Discuz! 的诞生&#xff1a;康盛创想的开源梦想 2001年&#xff0c;中国互联网正处于萌芽阶段&#xff0c;个人网站和论坛开始兴起。…

笔试强训:Day6

一、小红的口罩&#xff08;贪心优先级队列&#xff09; 登录—专业IT笔试面试备考平台_牛客网 #include<iostream> #include<queue> #include<vector> using namespace std; int n,k; int main(){//用一个小根堆 每次使用不舒适度最小的cin>>n>&…

谷歌Stitch:AI赋能UI设计,免费高效新利器

在AI技术日新月异的今天&#xff0c;各大科技巨头都在不断刷新我们对智能工具的认知。最近&#xff0c;谷歌在其年度I/O开发者大会期间&#xff0c;除了那些聚光灯下的重磅发布&#xff0c;还悄然上线了一款令人惊喜的AI工具——Stitch。这是一款全新的、完全免费的AI驱动UI&am…

运营商地址和ip属地一样吗?怎么样更改ip属地地址

‌在互联网时代&#xff0c;IP属地和运营商地址是两个经常被提及的概念&#xff0c;但它们是否相同&#xff1f;如何更改IP属地地址&#xff1f;这些问题困扰着许多网民。本文将深入探讨这两个概念的区别&#xff0c;并详细介绍更改IP属地地址的方法。 一、运营商地址和IP属地一…

在QT中,利用charts库绘制FFT图形

第1章 添加charts库 1.1 .pro工程添加chart库 1.1.1 在.pro工程里面添加charts库 1.1.2 在需要使用的地方添加这两个库函数&#xff0c;顺序一点不要搞错&#xff0c;先添加.pro&#xff0c;否则编译器会找不到这两个.h文件。 第2章 Charts关键绘图函数 2.1 QChart 类 QChart 是…

流媒体协议分析:流媒体传输的基石

在流媒体传输过程中&#xff0c;协议的选择至关重要&#xff0c;它决定了数据如何封装、传输和解析&#xff0c;直接影响着视频的播放质量和用户体验。本文将深入分析几种常见的流媒体传输协议&#xff0c;探讨它们的特点、应用场景及优缺点。 协议分类概述 流媒体传输协议根据…

vscode中让文件夹一直保持展开不折叠

vscode中让文件夹一直保持展开不折叠 问题 很多小伙伴使用vscode发现空文件夹会折叠显示, 让人看起来非常难受, 如下图 解决办法 首先打开设置->setting, 搜索compact Folders, 去掉勾选即可, 如下图所示 效果如下 看起来非常爽 ! ! !

JAVA-springboot整合Mybatis

SpringBoot从入门到精通-第15章 MyBatis框架 学习MyBatis心路历程 2022年学习java基础时候&#xff0c;想着怎么使用java代码操作数据库&#xff0c;咨询了项目上开发W同事&#xff0c;没有引用框架&#xff0c;操作数据库很麻烦&#xff0c;就帮我写好多行代码&#xff0c;就…

深度学习pycharm debug

深度学习中&#xff0c;Debug 是定位并解决代码逻辑错误&#xff08;如张量维度不匹配&#xff09;、训练异常&#xff08;如 Loss 波动&#xff09;、数据问题&#xff08;如标签错误&#xff09;的关键手段&#xff0c;通过打印维度、可视化梯度等方法确保模型正常运行、优化…

MicroPython+L298N+ESP32控制电机转速

要使用MicroPython控制L298N电机驱动板来控制电机的转速&#xff0c;你可以通过PWM&#xff08;脉冲宽度调制&#xff09;信号来调节电机速度。L298N是一个双H桥驱动器&#xff0c;可以同时控制两个电机的正反转和速度。 硬件准备&#xff1a; 1. L298N 电机控制板 2. ESP32…

在部署了一台mysql5.7的机器上部署mysql8.0.35

在已部署 MySQL 5.7 的机器上部署 MySQL 8.0.35 的完整指南 在同一台服务器上部署多个 MySQL 版本需要谨慎规划&#xff0c;避免端口冲突和数据混淆。以下是详细的部署步骤&#xff1a; 一、规划配置 端口分配 MySQL 5.7&#xff1a;使用默认端口 3306MySQL 8.0.35&#xff1…

QT入门学习(一)---新建工程与、信号与槽

一: 新建QT项目 二:QT文件构成 2.1 first.pro 项目管理文件&#xff0c;下面来看代码解析 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11TARGET main# The following define makes your compiler emit warnings if you use # any Qt feature …

UE5.4.4+Rider2024.3.7开发环境配置

文章目录 一、UE5安装 安装有两种方式一种的源码编译安装、一种是EPIC安装&#xff0c;推荐后者&#xff0c;只需要注册一个EPIC账号就可以一键安装。 二、C环境安装 1.下载VisualStudioSetup 下载链接如下下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 选择社…

Windows环境下PHP,在PowerShell控制台输出中文乱码

解决方法&#xff1a; 以管理员运行PowerShell , 输入&#xff1a; chcp 65001 重启控制台&#xff1b;然后就正常输出中文&#xff1b;

性能优化 - 理论篇:性能优化的七类技术手段

文章目录 Pre引言性能优化的七类技术手段性能优化策略一览表1. 复用优化2. 计算优化2.1 并行执行2.2 变同步为异步2.3 惰性加载 3. 结果集优化3.1 数据格式与协议选择3.2 字段精简与按需返回3.3 批量处理与分页3.4 索引与位图加速 4. 资源冲突优化4.1 锁的分类与特点4.2 无锁与…

华为IP(7)

端口隔离技术 产生的背景 1.以太交换网络中为了实现报文之间的二层隔离&#xff0c;用户通常将不同的端口加入不同的VLAN&#xff0c;实现二层广播域的隔离。 2.大型网络中&#xff0c;业务需求种类繁多&#xff0c;只通过VLAN实现二层隔离&#xff0c;会浪费有限的VLAN资源…

AIGC与影视制作:技术革命、产业重构与未来图景

文章目录 一、AIGC技术全景&#xff1a;从算法突破到产业赋能1. **技术底座&#xff1a;多模态大模型的进化路径**2. **核心算法&#xff1a;从生成对抗网络到扩散模型的迭代** 二、AIGC在影视制作全流程中的深度应用1. **剧本创作&#xff1a;从“灵感枯竭”到“创意井喷”**2…

Cursor 玩转 腾讯地图 MCP Server

腾讯地图WebService API 服务简介 腾讯地图WebService API 是基于HTTPS/HTTP协议构建的标准化地理数据服务接口。该接口支持跨平台调用&#xff0c;开发者可使用任意客户端、服务器端技术及编程语言&#xff0c;遵循API规范发起HTTPS请求&#xff0c;获取地理信息服务&#xf…