react-组件进阶

news2025/1/21 15:43:39

1.目标

能够实用props接收数据
能够实现父子组件之间的通讯
能够实现兄弟组件之间的通讯
能够给组件添加props校验
能够说出生命周期常用的钩子函数
能够知道高阶组件的作用

2.目录

组件通讯介绍
组件的props
组件通讯的三种方式
Context
props深入
组件的生命周期
Render-props和高阶组件

3.react tool

在这里插入图片描述
安装 React Devloper Tools 插件

4.组件通讯介绍

组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据。在组件化过程中,我们将一个完整
的功能拆分成多个组件,以更好的完成整个应用的功能。而在这个过程中,多个组件之间不可避免的要
共享数据。为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通。这个过程就是组件通
讯。

5.组件的props

A. 组件是封闭的,要接收外部数据应该通过props来实现
B. props的作用:接收传递给组件的数据
C. 传递数据:给组件标签添加属性
D. 接收数据:函数组件通过参数props接收数据,类组件通过this.props接收数据

function Hello(props) {
  return <div>接收到的值:{props.name}</div>;
}

class Hello1 extends React.Component {
  constructor() {
    super();
  }
  render() {
    return <div>接收到的值:{this.props.name}</div>;
  }
}

ReactDOM.createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <Hello name="张三"></Hello>
    <Hello1 name="李四"></Hello1>
  </React.StrictMode>
);

5.1 特点

A. 可以给组件传递任意类型的数据
B. props是只读的对象,只能读取属性的值,无法修改对象
C. 注意:使用类组件时,如果写了构造函数,应该将props传递给super(),否则,无法再构造函数中获取
到props!

class Hello2 extends React.Component {
	constructor(props) {
		//推荐将props传递给父类构造函数 ???
		super(props)
	}
render() {
	return (
		<div>
			接收到的数据:{this.props.age}
		</div>
		)
	}
}
ReactDOM.render(<Hello2 name='rose' age={22}></Hello2>,document.getElementById('root'));

5.2 其他类型数据

class Hello2 extends React.Component {
	constructor() {
		//推荐将props传递给父类构造函数
		super()
	}
render() {
	return (
		<div>
			接收到的数据:{this.props.age} {this.props.tag}
		</div>
	)
}
ReactDOM.render(<Hello2 name='rose' age={22} colors={['red', 'yellow', 'blue']}
fn={() => { console.log('这是一个函数') }} tag={<p>这是一个P标签</p>}></Hello2>,
document.getElementById('root'));

6.组件通讯的三种方式

组件之间的通讯分为3种:
A. 父组件->子组件
B. 子组件->父组件
C. 兄弟组件

6.1 父组件传递数据给子组件

A. 父组件提供要传递的state数据
B. 给子组件标签添加属性,值为state中的数据
C. 子组件中通过props接收父组件中传递的数据

.parent {
  background-color: skyblue;
  height: 200px;
}

.child {
  background-color: pink;
  height: 100px;
}
// 父组件给子组件传值
class Parent61 extends React.Component {
  state = { lastName: "练" };
  render() {
    return (
      <div className="parent">
        父组件:{this.state.lastName + "凝"}
        <Child61 lastName="道济"></Child61>
      </div>
    );
  }
}

const Child61 = (props) => {
  return (
    <div className="child">子组件接受到父组件传的值:{props.lastName}</div>
  );
};

ReactDOM.createRoot(document.getElementById("root")).render(
  <Parent61></Parent61>
);

6.2 子组件传递数据给父组件

思路:利用回调函数,父组件提供回调,子组件调用,将要传递的数据作为回调函数的参数。
A. 父组件提供一个回调函数(用于接收数据)
B. 将该函数作为属性的值,传递给子组件
C. 子组件通过props调用回调函数
D. 将子组件的数据作为参数传递给回调函数
注意:回调函数里面的this指向问题

// 6.2
class Parent extends React.Component {
  state = {
    sonMsg: "",
  };
  getChildMsg = (msg) => {
    this.setState({
      sonMsg: msg,
    });
  };
  render() {
    return (
      <div>
        子组件传过来的值:{this.state.sonMsg}
        <Child getMsg={this.getChildMsg}></Child>
      </div>
    );
  }
}

class Child extends React.Component {
  state = {
    sonMsg: "react牛掰!!!",
  };
  sendMsg = () => {
    this.props.getMsg(this.state.sonMsg);
  };
  render() {
    return (
      <div>
        <button onClick={this.sendMsg}>向父组件传值</button>
      </div>
    );
  }
}

ReactDOM.createRoot(document.getElementById("root")).render(<Parent></Parent>);

6.3 兄弟传值

A. 将共享数据提升到最近的公共父组件中,由公共父组件管理这个状态
B. 思想:状态提升
C. 公共父组件职责:1.提供共享状态 2.提供操作共享状态的方法
D. 要通过的子组件只需通过props接收状态或操作状态的方法

class Parent63 extends React.Component {
  // 提供公共状态
  state = {
    count: 0,
  };
  // 提供修改状态的方法
  onIncrement = () => {
    this.setState({
      count: this.state.count + 1,
    });
  };
  render() {
    return (
      <div>
        <Child631 count={this.state.count}></Child631>
        <Child632 onIncrement={this.onIncrement}></Child632>
      </div>
    );
  }
}
const Child631 = (props) => {
  return <div>计数器{props.count}</div>;
};
const Child632 = (props) => {
  return <button onClick={() => props.onIncrement()}>+1</button>;
};

ReactDOM.createRoot(document.getElementById("root")).render(
  <Parent63></Parent63>
);

6.4 context

思考:App组件要传递数据给Child组件,该如何处理
A. 处理方式:使用props一层层组件往下传递(繁琐)
B. 更好的姿势:使用Context
C. 作用:跨组件传递数据(比如:主题、语言等)
在这里插入图片描述

6.4.1 使用步骤

A. 调用React.createContext()创建Provider(提供数据)和Consumer(消费数据)两个组件。
B.使用Provider组件作为父节点
C. 设置value属性,表示要传递的数据
D. 调用Consumer组件传递数据

.app64{
background-color: red;
padding:20px;
}
.node64{
background-color: yellow;
padding:20px;
}
.subNode64{
background-color: green;
padding:20px;
}
.child64{
background-color: purple;
padding: 20px;
}
// 创建context得到两个组件
const { Provider, Consumer } = React.createContext();

class App64 extends React.Component {
  render() {
    return (
      <div>
        <Provider value={"hello"}>
          <div className="app64">
            <Node64></Node64>
          </div>
        </Provider>
      </div>
    );
  }
}

const Node64 = () => {
  return (
    <div className="node64">
      <SubNode64></SubNode64>
    </div>
  );
};

const SubNode64 = () => {
  return (
    <div className="subNode64">
      <Child64></Child64>
    </div>
  );
};

const Child64 = () => {
  return (
    <div className="child64">
      <Consumer>{(data) => <span>我是子节点{data}</span>}</Consumer>
    </div>
  );
};

ReactDOM.createRoot(document.getElementById("root")).render(<App64></App64>);

在这里插入图片描述

6.4.2 总结

A. 如果两个组件是远方亲戚(比如,嵌套多层)可以使用Context实现组件通讯
B. Context提供了两个组件:Provider和Consumer
C. Provider组件:用来提供数据
D. Consumer组件:用来消费数据

7.props深入

7.1 children属性

A. children属性:表示组件标签的子节点。当组件标签有子节点时,props就会有该属性
B. children属性与普通的props一样,值可以是任意值(文本、React元素、组件,甚至是函数)

const App1 = (props) => {
  console.log(props);
  return (
    <div>
      <h1>组件标签的子节点:</h1>
      {props.children}
    </div>
  );
};

ReactDOM.createRoot(document.getElementById("root")).render(
  <App1>
    <p>我是p标签</p>
    {/* {() => {
      console.log(123);
    }} */}
  </App1>
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1475040.html

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

相关文章

死区过滤器Deadband和DeadZone区别(应用介绍)

死区过滤器的算法和详细介绍专栏也有介绍,这里我们主要对这两个模块的区别和应用场景进行详细介绍 1、死区过滤器 https://rxxw-control.blog.csdn.net/article/details/128521007https://rxxw-control.blog.csdn.net/article/details/128521007 1、Deadband和DeadZone区别…

计算机网络:深入探索HTTP

引言&#xff1a; HTTP&#xff0c;全称超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff09;&#xff0c;是互联网上数据通信的基础。它定义了客户端&#xff08;如浏览器&#xff09;和服务器之间如何交互和传输数据。HTTP最初是为了支持Web浏览而设计的&…

面试经典150题——汇总区间

"The only place where success comes before work is in the dictionary." - Vidal Sassoon 1. 题目描述 2. 题目分析与解析 2.1 思路一 因为题目提示了我们数组是有序的&#xff0c;而覆盖区间都是根据数组中连续数字来确定的&#xff0c;比如&#xff1a; 可以…

Linux/Spectra

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和3306端口&#xff0c;端口详细信息如下 22端口运行着ssh&#xff0c;80端口还是http&#xff0c;不过不同的是打开了mysql的3306端口 TCP/80 进入首页&#xff0c;点击链接时&#xff0c;提示域名不能解析&…

5分钟看懂安迪比尔定律

大家好&#xff0c;我是董董灿。 今天跟大家聊一个&#xff0c;在写程序的过程中节省内存的这个话题。 话题来源于一个小伙伴问&#xff1a;我在写程序的时候,更改一个判断语句,会提升几毫秒,换一种方法会节省几KB&#xff0c;这些有必要吗&#xff1f; 这里涉及到一个软件与…

搭建sql-labs-master

环境&#xff1a;win10 解压sql-labs-master靶场文件&#xff0c;会提示有重复&#xff0c;直接覆盖就好。 将sql-labs-master文件拖到phpstudy/www目录下 打开浏览器访问“本机ip/sql-labs-master或localhost/sql-labs-master或127.0.0.1/sql-labs-master” 页面底部就是此靶…

Spring Boot项目误将Integer类型写成int来进行传参

在处理项目中Idea中无报错&#xff1a; 问题&#xff1a; localhost:8080/param/m2在浏览器中输入&#xff1a;localhost:8080/param/m2 产生报错&#xff1a; This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Feb 27 20:55…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的生活垃圾检测与分类系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详细讲述了如何利用深度学习构建一个生活垃圾检测与分类系统&#xff0c;并且提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比&#xff0c;展示了其在图像、视频、实时视频流和批量…

【virtual Box】功能速通:安装 Windows 和 Ubuntu

文章目录 一、虚拟机1.1 概述1.2 virtual box概述 二、新建虚拟机、删除、注册三、虚拟机内部设置3.1 安装增强功能驱动3.2 分辨率问题3.3 网络链接方式 一、虚拟机 1.1 概述 虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;是一种软件实现的计算机系统&#x…

Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget

表格和excel例子如下图所示&#xff1a; 一、QTableWidget保存表格数据到Excel文件中 代码如下&#xff1a; &#xff08;pro文件中添加QT axcontainer&#xff09; #include <QAxObject>void MainWindow::saveTableToExcel() {QDateTime current_date_time QDateTi…

【计算机网络】Socket的OOBInline选项与UrgentData

Socket的OOBINLINE选项是用于处理TCP紧急数据的一个设置。TCP紧急数据通常指的是那些需要优先处理的数据&#xff0c;例如某些控制信息或关键数据。 OOB&#xff08;Out-of-Band&#xff09;表示带外数据&#xff0c;OOBInline是一个Socket选项&#xff0c;用于控制是否将接收…

基于GWO优化的LSTM多输入分类预测(Matlab)灰狼算法优化长短期神经网络分类预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台编译&…

自动驾驶框架:自动驾驶汽车定位-感知-规划-决策-控制概述,按照我的架构图理解:决策决定的是速度,规划决定的是路径(架构理解推荐)

1.按照我的架构图理解&#xff1a;决策决定的是速度&#xff0c;规划决定的是路径 参考链接&#xff1a;【自动驾驶】运动规划丨速度规划丨自动驾驶速度规划及状态协调方法 2.下面是参考别人的理解&#xff1a; 自动驾驶汽车定位-感知-规划-决策-控制概述 规划-决策-控制知…

女儿的国风穿搭~粉绿两色你喜欢哪个?

法国皱绣花马甲和飘雅面料衬衫的组合 赋予古典新的诠释&#xff0c;别具一番韵味 衣服上是古典的山树绣花设计 精致典雅&#xff0c;上身立体又轻盈 做了粉绿两色&#xff0c;很适合春天的氛围

【王道数据结构】【chapter7查找】【P285t5】

线性表中各节点的检索概率不等时&#xff0c;可用如下策略提高顺序检索的效率&#xff1b;若找到指定的结点&#xff0c;则将该结点和其前驱结点&#xff08;若存在&#xff09;交换&#xff0c;使得经常被访问的结点尽量位于表的前端。试设计在顺序结构和链式结构的线性表盘上…

在正式项目中使用Improv配网及小程序配网工具

前面我们演示了使用.Net nanoFramework为ESP32进行蓝牙配网的简单演示&#xff0c;这个功能在实际项目中是非常有用的。当然&#xff0c;使用中我们还需要考虑一些其他的问题&#xff0c;比如如何将这个功能集成到我们的项目中&#xff0c;本文将详细介绍如何在正式项目中使用I…

Java进阶-集合(1)

进入Java集合的学习&#xff0c;集合的数学概念是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。在Java中的集合也是类似的&#xff0c;先学习集合的框架&#xff0c;这次主要介绍一下Conllection接口。 一、概述 1、数组存储 数组存储具有两大缺点&#xff1a; …

BevFusion (2): nuScenes 数据介绍及点云可视化

1. nuScenes 数据集 1.1 概述 nuScenes 数据集 (pronounced /nu:ːsiː:nz/) 是由 Motional (以前称为 nuTonomy) 团队开发的自动驾驶公共大型数据集。nuScenes 数据集的灵感来自于开创性的 KITTI 数据集。 nuScenes 是第一个提供自动驾驶车辆整个传感器套件 (6 个摄像头、1 …

FinalShell控制远程Linux服务器(首先得自己已购买好Linux服务器并安装了对应的系统,这里是安装的centos系统)

1、电脑上需要安装FinalShell软件 可以到分享的链接中下载软件&#xff0c;然后双击点击下一步安装即可 链接&#xff1a;https://share.weiyun.com/Y6TrdDHp 密码&#xff1a;gbvyg62、建立远程连接 3、输入连接信息 4、显示连接主机成功&#xff0c;表示远程进入 5、输入…

java高级——反射

目录 反射概述反射的使用获取class对象的三种方式反射获取类的构造器1. 获取类中所有的构造器2. 获取单个构造器 反射获取构造器的作用反射获取成员变量反射变量赋值、取值获取类的成员方法反射对象类方法执行 反射简易框架案例案例需求实现步骤代码如下 反射概述 什么是反射 反…