react-组件进阶

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>
);

7.2 props校验

A. 对于组件来说,props是外来的,无法保证组件使用者传入什么格式的数据
B. 如果传入的数据格式不对,可能会导致组件内部报错
C. 关键问题:组件的使用者不知道明确的错误原因

function App72(props) {const list = props.list;const lis = list.map((item, index) => <li key={index}>{item}</li>);return <ul>{lis}</ul>;
}ReactDOM.createRoot(document.getElementById("root")).render(<App72 list={19}></App72>
);

D.props校验:允许在创建组件的时候,就指定props的类型、格式等
E. 作用:捕获使用组件时因为props导致的错误,给出明确的错误提示,增加组件的健壮性

7.2.1 使用步骤

A. 安装包prop-types(yarn add prop-types/npm i prop-types)
B. 导入prop-types包
C. 使用组件名.propTypes={}来给组件的props添加校验规则
D. 校验规则通过PropTypes对象来指定
在这里插入图片描述

import PropTypes from "prop-types";
function App721(props) {const list = props.list;const lis = list.map((item, index) => <li key={index}>{item}</li>);return <ul>{lis}</ul>;
}
App721.propTypes = {//约定list属性为array类型//如果类型不对,则报错明确错误,便于分析错误原因list: PropTypes.array,
};ReactDOM.createRoot(document.getElementById("root")).render(<App721 list={19}></App721>
);

7.3 props的默认值

A. 场景:分页组件->每页显示条数
B. 作用:给props设定默认值,在未传入props时生效

class App73 extends React.Component {render() {return (<div>此处展示props默认值:{this.props.age} {this.props.gender}</div>);}
}App73.defaultProps = {age: 18,gender: "男",
};ReactDOM.createRoot(document.getElementById("root")).render(<App73 name="zs"></App73>
);

8.组件的生命周期

8.1 组件的生命周期概述

A. 意义:组件的生命周期有助于理解组件的运行方式,完成更复杂的组件功能,分析组件错误原因等
B. 组件的生命周期:组件从被创建到挂载到页面中运行,再到组件不用时卸载的过程
C. 生命周期的每个阶段总是伴随着一些方法调用,这些方法就是生命周期的钩子函数。
D. 钩子函数的作用:为开发人员再不同阶段操作组件提供了时机
E. 只有类组件才有生命周期

8.2 生命周期的三个阶段

A. 每个阶段的执行时机
B. 每个阶段钩子函数的执行顺序
C. 每个阶段钩子函数的作用
在这里插入图片描述

8.2.1 创建时(挂载阶段)

A. 执行时机:组件创建时(页面加载时)
B. 执行顺序:
在这里插入图片描述constructor:创建组件时,最先执行。初始化state和为事件处理程序绑定this
render:每次组件渲染都会触发,渲染ui(注意:不能调用setState)
componentDidMount:组件挂载(完成DOM渲染)后,发送网络请求,DOM操作

class App821 extends React.Component {constructor(props) {super(props);// 初始化数据this.state = {count: 0,};// 主要处理this指向问题console.log("生命周期钩子函数:constructor");const title = document.getElementById("h1");console.log("constructor中的DOM为" + title); // null,获取不到DOM}// 进行DOM操作// 发送ajax请求,获取远程数据componentDidMount() {const title = document.getElementById("h1");console.log("componentDidMount中的DOM为" + title); // 获取到了}render() {// 不要在render中调用setState// this.setState({//   count: 1,// });console.log("生命周期钩子函数:render");return (<div><h1 id="h1">统计豆豆被打的次数:</h1><button>打豆豆</button></div>);}
}ReactDOM.createRoot(document.getElementById("root")).render(<App821></App821>);

8.2.2 更新时(更新阶段)

A. 执行时机:1.setState() 2.forceUpdate() 3.组件接收到新的props
B. 说明:以上三者任意一种变化,组件就会重新渲染
C. 执行顺序:
在这里插入图片描述
render():每次组件渲染都会触发,渲染UI(在挂载阶段是同一个render)
componentDidUpdate():组件更新(完成DOM渲染)后,发送网络请求,DOM操作(注意:如果要
setState()必须放在一个if条件中)

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

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

相关文章

数据结构:循环队列

一、队列的概念 操作受限的线性表&#xff0c;允许在队列的一端执行入队操作&#xff0c;另一端执行出队操作 先进先出(FIFO) 1.顺序队列 物理结构连续&#xff0c;依赖于数组实现 队列中有一个队头指针和队尾指针&#xff0c;队头指针保存每次要出队的元素&#xff0c;队…

SpringCloud--Nacos解析

一、Nacos简介 Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台&#xff0c;是阿里巴巴开源的一个项目&#xff0c;旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集&#xff0c;可以快速的实现动态服务发现、服务配置、服务元…

2024食品工程与智慧农业国际学术会议(ICFESA2024)

2024食品工程与智慧农业国际学术会议(ICFESA2024) 一、【会议简介】 2024食品工程与智慧农业国际学术会议&#xff08;ICFESA2024&#xff09;是一个专注于食品工程和智慧农业领域的国际学术会议。会议将在杭州举行&#xff0c;该会议旨在汇聚全球相关领域的专家学者&#xff…

LiveGBS流媒体平台GB/T28181功能-查看国标设备下通道会话列表直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话

LiveGBS流媒体平台GB/T28181功能-查看直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、下载…

Windows网络问题:局域网内电脑连接wifi连不上

Windows网络问题&#xff1a;局域网内电脑连接wifi连不上 前提连接的网络没有问题 1、身边是否有人能连接上此网络 2、判断是否是无线网络的问题&#xff0c;寻找有线网络尝试 3、通过手机热点测试是否是电脑本身问题 经过上述的几步判断&#xff0c;如果是电脑本身的问题进行…

Qt中tableView控件的使用

tableView使用注意事项 tableView在使用时&#xff0c;从工具栏拖动到底层页面后&#xff0c;右键进行选择如下图所示&#xff1a; 此处需要注意的是&#xff0c;需要去修改属性&#xff0c;从UI上修改属性如下所示&#xff1a; 也可以通过代码修改属性&#xff1a; //将其设…

栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。 首先回顾一下栈的性质&#xff1a; 栈的存储数据的原则是“后入先出”&#xff0c; 先入的在栈底&#xff0c; 后入的在栈顶。 弹出数据时在栈顶弹出。 开始实现栈的接口 栈的所有函数接口 //栈的初始化 void StackInit(Stack* pst); //入栈…

某查查首页瀑布流headers加密

目标网站&#xff1a; 某查查 对目标网站分析发现 红框内的参数和值都是加密的&#xff0c;是根据算法算出来的&#xff0c;故进行逆向分析。 由于没有固定参数名&#xff0c;只能通过搜索headers&#xff0c;在搜索的位置上打上断点&#xff0c;重新请求。 断点在此处断住&a…

半小时到秒级,京东零售定时任务优化怎么做的?

导言&#xff1a; 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法&#xff0c;除了供大家借鉴参考之外&#xff0c;也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源&#xff0c;避免在流量突增时给系统…

Data Leakage and Evaluation Issues inMicro-Expression Analysis 阅读笔记

IEEE Transactions on Affective Computing上的一篇文章&#xff0c;做微表情识别&#xff0c;阅读完做个笔记。本文讨论了Data Leakage对模型准确度评估的影响&#xff0c;及如何融合多个微表情数据集&#xff0c;从而提升模型的准确度。工作量非常饱满&#xff0c;很认真&…

HTTP与HTTPS-HTTPS 的应用数据是如何保证完整性的?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTPS 的应用数据是如何保证完整性的? TLS 在实现上分为握手协议和记录协议两层 TLS 握手协议就是我们前面说的 TLS 四次握手的过程&#xff0c;负责协商加密算法和生成对称密钥&#xff0c;后续用此密…

第7集《灵峰宗论导读》

《灵峰宗论》导读。诸位法师&#xff0c;诸位同学&#xff0c;阿弥陀佛&#xff01;&#xff08;阿弥陀佛&#xff01;&#xff09; 请大家打开讲义第16面。 在这一科当中讲到乙一、发心篇&#xff0c;发心篇总共有五篇的论文。前面两篇主要是说明成佛作祖、堕坑落堑&#xf…

Dockerfile(3) - WORKDIR 指令详解

WORKDIR 切换到镜像中的指定路径&#xff0c;设置工作目录在 WORKDIR 中需要使用绝对路径&#xff0c;如果镜像中对应的路径不存在&#xff0c;会自动创建此目录一般用 WORKDIR 来替代 切换目录进行操作的指令 RUN cd <path> && <do something> WORKDIR…

WPF 【十月的寒流】学习笔记(3):DataGrid分页

文章目录 前言相关链接代码仓库项目配置&#xff08;省略&#xff09;项目初始配置xamlviewModel Filter过滤详细代码展示结果问题 Linq过滤CollectionDataxamlviewModel sql&#xff0c;这里用到数据库&#xff0c;就不展开了 总结 前言 我们这次详细了解一下列表通知的底层是…

分享three.js和cannon.js构建Web 3D场景

使用 three.js&#xff0c;您不再需要花哨的游戏PC或控制台来显示逼真的3D图形。 您甚至不需要下载特殊的应用程序。现在每个人都可以使用智能手机和网络浏览器体验令人惊叹的3D应用程序。 这个惊人的库和充满活力的社区是您在浏览器、笔记本电脑、平板电脑或智能手机上创建游…

jmeter(四)HTTP请求

启动jmeter&#xff0c;建立一个测试计划 这里再次说说怎么安装和启动jmeter吧&#xff0c;昨天下午又被人问到怎样安装和使用&#xff0c;我也是醉了&#xff1b;在我看来&#xff0c;百度能解决百分之八十的问题&#xff0c;特别是基础的问题。。。 安装&#xff1a;去官网…

账户名密码是怎样被窃取的,简单模拟攻击者权限维持流程。

前言 在我们进行渗透测试的时候&#xff0c;常常需要进行权限维持&#xff0c;常见的 Javascript窃取用户凭证是一种常见的攻击手法。之前我们可能学习过钓鱼网页的使用&#xff0c;如果我们通过渗透测试进入到用户的服务器&#xff0c;其实也可以通过在网页中植入Javascript代…

Python + Selenium —— 常用控制方法!

Selenium 体系中用来操作浏览器的 API 就是 WebDriver&#xff0c;WebDriver 针对多种语言都实现了一套 API&#xff0c;支持多种编程语言。 Selenium 通常用来做自动化测试&#xff0c;或者编写网络爬虫。 通常我们说的 Selenium 自动化操作&#xff0c;指的就是 WebDriver …

AI:138-开发一种能够自动化生成艺术品描述的人工智能系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

备战蓝桥杯————如何判断回文链表

如何判断回文链表 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a;…