React(四)

    • 一、事件总线
    • 二、关于setState的原理
      • 1. setState的三种使用方式
        • (1)基本使用
        • (2)传入一个回调
        • (3)第一个参数是对象,第二个参数是回调
      • 2. 为什么setState要设置成异步
        • (1)提升性能,减少render次数
        • (2)避免state和props数据不同步
      • 3. 获取异步修改完数据的结果
    • 三、PureComponent监测数据的原理
      • 1. 先来看一个问题
      • 2. sholdComponentUpdate()
      • 3. 引出PureComponent
        • (1)类组件
        • (2)函数组件
      • 4. PureComponent只监测第一层
      • 5. PureComponent如何监测深层数据的改变
    • 四、ref获取元素或组件实例
      • 1. ref的三种用法
      • 2. ref获取类组件实例
      • 3. ref获取函数组件内的某个元素

一、事件总线

这里的事件总线和vue中基本一个思路。

在React中可以通过第三方库来进行任意组件通信,安装:

npm install hy-event-store

使用:
在这里插入图片描述
1、在某个地方新建jsx文件对外暴露事件总线

// 创建事件总线
import { HYEventBus } from 'hy-event-store';
const eventBus = new HYEventBus();export default eventBus;

2、在需要接收值的组件中,在挂在完毕的生命周期函数中绑定事件和被触发时的回调,最好写上销毁的代码:

//事件的回调getData(name,age) {console.log(name,age,this);this.setState({name: name, age: age})}//1.挂载完毕后绑定事件接收别的地方传过来的值componentDidMount() {eventBus.on('getData', this.getData.bind(this))}//3.销毁的时候解绑componentWillUnmount() {eventBus.off('getData', this.getData)}

3、另一个组件触发,并传值

sendData() {//2.某个组件中触发事件并传值eventBus.emit('getData', 'zzy', 18)}render() {return (<div><h1>GrandSon组件</h1><button onClick={() => this.sendData()}>点击传值给App</button></div>)}

二、关于setState的原理

开发中我们并不能直接通过修改state的值来让界面发生更新:
因为我们修改了state之后,希望React根据最新的State来重新渲染界面,但是这种方式的修改React并不知道数据发生了变化;
React并没有实现类似于Vue2中的Object.defineProperty或者Vue3中的Proxy的方式来通过数据劫持监听数据的变化;
我们必须通过setState来告知React数据已经发生了变化;
源码先简单lou一眼:
在这里插入图片描述

1. setState的三种使用方式

我们基于以下组件进行操作

export class Son extends React.Component {constructor() {super();this.state = {name: 'zzy',age: 18,}}changeName() {this.setState(...)}render() {return (<div><h1>{this.state.name}</h1><button onClick={() => this.changeName()}>点击修改名字</button></div>)}
}
(1)基本使用

我们之前用的最多的就是直接传入一个配置对象,然后给state中数据重新赋值。这里的原理是借助了Object.assign(state, newState)state和传入的对象进行合并,如果key重复那么就进行值的覆盖,没改的继续保留

//1.基本使用,传入配置对象,不是覆盖原来的state,而是进行对象的合并
this.setState({name: 'ht'  //原理:对象的合并Object.assign(state, newState)
})
(2)传入一个回调

setState的参数除了可以传配置对象外,还可以传入一个回调函数,通过return一个对象,对象中包含我们要修改的值,也可以实现数据的更新和页面的重新渲染。

这个回调可以接收两个参数:state和props,分别对应的是上一个修改状态stateprops的值们。

注意是上一个修改状态!如果在一个回调中多次执行setState更改数据,那么参数state保存的是上一个修改状态的值!如果不明白请看本节2.1.1部分

//2.传入一个回调,可以接收修改之前的state和props
this.setState((state,props) => {console.log(state,props);return {name: 'ht' //这里也可以进行更改}
})
(3)第一个参数是对象,第二个参数是回调

setState是一个异步调用。

如果在setState下面使用name,我们会发现拿到的是原来的name,这就证明了setState是一个异步调用,那么如果我们想在数据变化后再基于数据进行一些操作怎么办?这时候可以传入第二个参数:一个回调函数,该回调函数执行的时机就是数据更新完且render调用完毕后

//3.setState是一个异步调用
//如果想等数据更新后做一些操作,可以传入第二个参数:回调
//第二个参数执行的时机就是数据更新完之后
this.setState({ name

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

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

相关文章

CPUcores-【硬核优化】CPU增强解锁全部内核!可优化游戏性能、提升帧数!启用CPU全内核+超线程,以更高优先级运行游戏!支持各种游戏和应用优化~

软件介绍&#xff08;文末获取&#xff09;CPUCores&#xff1a;游戏性能优化利器‌这款工具&#xff0c;专为优化提升中低配电脑的帧数而生。其独创的CPU资源调度技术&#xff0c;能让老旧硬件焕发新生核心技术原理‌采用「内核级隔离」方案&#xff0c;通过&#xff1a;系统进…

HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text

文本对抗性攻击分为白盒攻击和黑盒攻击&#xff0c;其中黑盒攻击更贴近现实&#xff0c;又可分为软标签和硬标签设置&#xff0c;。这些名词分别是什么意思 在文本对抗性攻击中&#xff0c;“白盒攻击”“黑盒攻击”以及黑盒攻击下的“软标签”“硬标签”设置&#xff0c;核心差…

PyCharm性能优化与大型项目管理指南

1. PyCharm性能深度调优 1.1 内存与JVM配置优化 PyCharm基于JVM运行,合理配置JVM参数可显著提升性能: # 自定义VM选项文件位置 # Windows: %USERPROFILE%\AppData\Roaming\JetBrains\<product><version>\pycharm64.exe.vmoptions # macOS: ~/Library/Applicat…

基于Java飞算AI的Spring Boot聊天室系统全流程实战

在当今数字化时代&#xff0c;实时通讯已成为现代应用不可或缺的核心功能。从社交平台到企业协作&#xff0c;从在线客服到游戏互动&#xff0c;实时聊天功能正以前所未有的速度渗透到各行各业。然而&#xff0c;开发一个功能完善的聊天室系统绝非易事——传统开发模式下&#…

在 Conda 环境下编译 C++ 程序时报错:version `GLIBCXX_3.4.30‘ not found

报错信息如下 ERROR:/root/SVF/llvm-16.0.4.obj/bin/clang: /opt/miniconda3/envs/py38/lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /root/SVF/llvm-16.0.4.obj/bin/clang)根据错误信息&#xff0c;问题是由于 Conda 环境中的libstdc.so.6缺少GLIBCXX_3…

vue+flask基于Apriori算法规则的求职推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01;编号&#xff1a;F069 基于Apriori关联规则职位相似度的推荐算法进行职位推荐 基于决策树、随机森林的预测薪资 vueflaskmysql爬虫 设计求…

机器学习第九课之DBSCAN算法

目录 简介 一、dbscan相关概念 二、dbscan的API 三、案例分析 1. 导入所需库 2. 数据读取与预处理 3. 数据准备 4. DBSCAN 参数调优 5. 确定最佳参数并应用 总结 简介 本次我们将聚焦于一款极具特色的聚类算法 ——DBSCAN。相较于 K-means 等需要预先指定簇数量的算法…

给AI开一副“健忘药”:Dropout如何治愈神经网络的死记硬背症

**——解读《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》**想象一位学生备考时&#xff0c;只反复背诵三套模拟题答案&#xff0c;却在真正的考场上面对新题型束手无策——这种**死记硬背不会举一反三**的问题&#xff0c;正是神经网络中的“过拟合”…

【框架】跨平台开发框架自用整理

Tauri 2.0 | Tauri https://github.com/tauri-apps/tauri 创建小型、快速、安全、跨平台的应用程序 独立于前端 将你现有的网络技术栈带到 Tauri 或开始新的项目。 Tauri 支持任何前端框架&#xff0c;所以你不需要改变你的技术栈。 跨平台 使用单个代码库为 Linux、macOS、W…

web前端第三次作业

一、作业要求&#xff1a;使用js完成抽奖项目 效果和内容自定义&#xff0c;可以模仿游戏抽奖页面二、代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…

wrap cpp variant as dll for c to use

包装c的variant给c用 variant_wrapper.cpp #include <variant> #include <unordered_map> #include <cstring> #include <cstdio> #include <new> #include <memory> #include <functional> #include <cstdlib>// 类型ID定义 …

GraphRAG查询(Query)流程实现原理分析

文章目录说明一 GraphRAG查询&#xff08;Query&#xff09;流程二 Local Search 实现原理三 Global Search 实现原理四 GraphRAG Python API使用说明 本文学自赋范社区公开课&#xff0c;仅供学习和交流使用&#xff01;本文重在介绍GraphRAG查询流程&#xff0c;有关索引构建…

服务器的安全检测和防御技术

1. 服务器安全风险1.1 不必要的访问&#xff08;如只提供HTTP服务&#xff09;若服务器仅需提供 HTTP 服务&#xff0c;却开放了其他不必要的访问途径&#xff0c;会增加风险。通过应用识别、控制&#xff0c;可精准识别应用类型&#xff0c;限制非必要访问&#xff0c;保障服务…

FileLink:为企业跨网文件传输筑牢安全与效率基石

FileLink&#xff1a;为企业跨网文件传输筑牢安全与效率基石在企业数据往来日益频繁的今天&#xff0c;跨网文件传输的安全性和高效性是企业顺畅运营的关键。传统传输方式在安全防护、系统融合及成本控制上的短板愈发明显&#xff0c;而 FileLink 凭借在这些方面的突出表现&…

java设计模式之开闭原则使用举例

1. 输入法皮肤扩展&#xff08;抽象类实现&#xff09; 场景&#xff1a;用户可为输入法更换不同皮肤&#xff08;如默认皮肤、CSDN皮肤&#xff09;。 实现&#xff1a; 抽象层&#xff1a;定义抽象类AbstractSkin&#xff0c;声明皮肤显示方法。扩展&#xff1a;新增皮肤只需…

Spark Shuffle机制原理

文章目录1.什么是Shuffle?2.Shuffle解决什么问题?3.Shuffle Write与Shuffle Read4.Shuffle的计算需求4.1 计算需求表4.2 partitionby4.3 groupByKey4.4 reduceByKey4.5 sortByKey5.Shuffle Write框架设计与实现5.1 Shuffle Write框架实现的功能5.2 Shuffle Write的多种情况5.…

Cursor vs Trae vs VSCode:2025终极IDE横评,谁才是开发者的效率之选?

前言 2025年的编程世界&#xff0c;AI不再只是辅助&#xff0c;而是编程工作流的核心驱动者。从微软的VSCode 到新锐 Cursor 与国产黑马 Trae &#xff0c;三大 IDE 正在重新定义“人机协作”的边界。本文从架构设计、AI能力、场景适配等维度&#xff0c;带你看透工具本质&…

Vue 安装指定版本依赖包、删除某个依赖包、依赖管理

如何安装指定版本的依赖包安装指定版本&#xff1a;一旦你知道了想要的版本号&#xff0c;比如3.4.0&#xff0c;你可以使用以下命令来安装这个版本的vue-router&#xff1a;npm install vue-router3.4.0 --save这里的^表示安装3.4.0的最新小版本更新&#xff0c;但不会超过主版…

psycopg2 如何验证链接是否有效

在 psycopg2 中&#xff0c;验证数据库连接是否有效&#xff08;即连接是否仍然活跃&#xff09;可以通过以下几种方法实现&#xff1a;1. 使用 conn.closed 属性 psycopg2 的连接对象有一个 closed 属性&#xff0c;可以检查连接是否已关闭&#xff1a; import psycopg2conn …

数据科学与计算-电商双11美妆数据分析

一、项目背景&#xff1a;双 11 美妆数据的价值所在 每年的 “双 11” 购物节都是电商行业的盛宴&#xff0c;而美妆品类作为消费热门领域&#xff0c;蕴含着丰富的用户行为与市场趋势信息。该项目聚焦双 11 期间的美妆电商数据&#xff0c;旨在通过数据分析揭示以下核心问题&…