当前位置: 首页 > news >正文

React PureComponent使用场景

1. 基本概念

1.1 什么是 PureComponent

PureComponent 是 React 提供的一个优化类组件,它通过自动实现 shouldComponentUpdate 生命周期方法,对 props 和 state 进行浅比较来决定是否需要重新渲染组件。

1.2 与 Component 的区别

// 普通 Component
class RegularComponent extends React.Component {render() {console.log('Regular Component render');return <div>{this.props.value}</div>;}
}// PureComponent
class OptimizedComponent extends React.PureComponent {render() {console.log('Pure Component render');return <div>{this.props.value}</div>;}
}

2. 使用场景

React.PureComponent 是 React 中一个非常有用的类,它是 React.Component 的一个变种,主要用于优化性能。PureComponent 会自动实现 shouldComponentUpdate 方法,并基于 浅比较(shallow comparison) 来决定组件是否需要重新渲染。

PureComponent 的使用场景
组件的 props 和 state 变化不复杂且不深层嵌套

如果组件的 props 或 state 是简单类型(如 string、number、boolean 等),或者是浅层嵌套的对象数组,PureComponent 的性能优化非常有效。
PureComponent 会对 props 和 state 进行浅比较,如果值没有变化,组件就不会重新渲染。
使用场景:

比如当你有一个只渲染传入文本的组件,如果文本没有变化,PureComponent 会避免不必要的重新渲染。

class MyComponent extends React.PureComponent {render() {return <div>{this.props.text}</div>;}
}

组件渲染的内容相对静态,且频繁更新的场合

当某个组件被频繁地父组件更新(比如父组件经常调用 setState),但该组件的部分 props 或 state 没有变化时,使用 PureComponent 可以有效避免不必要的渲染,从而提升性能。
使用场景:

比如你有一个列表组件,父组件可能会触发更新,但列表项本身不会改变,使用 PureComponent 可以减少渲染的次数。

class ListItem extends React.PureComponent {render() {return <li>{this.props.name}</li>;}
}

需要避免深度比较的情况下

PureComponent 使用 浅比较 来判断 props 和 state 是否变化。如果你的 props 和 state 中包含的是对象或数组,并且这些对象是由父组件传递过来的新引用(即使它们的内容没变),PureComponent 也会认为它们发生了变化,导致重新渲染。
使用 PureComponent 可以避免显式编写 shouldComponentUpdate 来实现自定义的浅比较,特别是在简单应用中可以减少代码量。
避免在 shouldComponentUpdate 中手动比较

PureComponent 会自动处理浅比较,而你不需要手动编写 shouldComponentUpdate。这在很多情况下可以减少代码复杂度,避免开发者手动处理复杂的比较逻辑。
大白话:子组件不依赖当前状态变化时子组件使用PureComponent,父组件改变的值不要引起render渲染的时候,避免引用地址不变的对象属性值修改

2.1 简单数据类型的 props

// 适合使用 PureComponent 的场景
class NumberDisplay extends React.PureComponent {render() {return <div>{this.props.number}</div>;}
}// 父组件
class Parent extends React.Component {state = { number: 1 };updateNumber = () => {this.setState({ number: 2 });};render() {return (<div><NumberDisplay number={this.state.number} /><button onClick={this.updateNumber}>Update</button></div>);}
}

2.2 复杂数据结构的处理

// 不恰当的使用方式
class BadExample extends React.PureComponent {render() {// 每次渲染都创建新对象,导致浅比较失效const data = { value: this.props.value };return <div>{data.value}</div>;}
}// 正确的使用方式
class GoodExample extends React.PureComponent {render() {return <div>{this.props.data.value}</div>;}
}// 父组件
class Parent extends React.Component {state = {data: { value: 'hello' }};updateValue = () => {// 创建新的对象引用this.setState({data: { ...this.state.data, value: 'world' }});};
}

3. 性能优化实践

3.1 避免内联对象

// 错误示例
class Parent extends React.Component {render() {return (<PureChildstyle={{ color: 'red' }}  // 每次渲染都创建新对象data={{ value: 42 }}      // 每次渲染都创建新对象/>);}
}// 正确示例
class Parent extends React.Component {style = { color: 'red' };  // 类属性,保持引用不变data = { value: 42 };      // 类属性,保持引用不变render() {return (<PureChildstyle={this.style}data={this.data}/>);}
}

3.2 避免内联函数

// 错误示例
class Parent extends React.Component {render() {return (<PureChildonClick={() => console.log('clicked')}  // 每次渲染都创建新函数/>);}
}// 正确示例
class Parent extends React.Component {handleClick = () => {console.log('clicked');};render() {return (<PureChildonClick={this.handleClick}  // 使用类方法,保持引用不变/>);}
}

3.3 使用不可变数据

class TodoList extends React.PureComponent {state = {todos: []};// 正确的更新方式addTodo = (todo) => {this.setState(prevState => ({todos: [...prevState.todos, todo]  // 创建新数组}));};updateTodo = (index, newTodo) => {this.setState(prevState => ({todos: prevState.todos.map((todo, i) =>i === index ? { ...todo, ...newTodo } : todo)}));};// 错误的更新方式wrongUpdate = (index, newTodo) => {const { todos } = this.state;todos[index] = newTodo;  // 直接修改数组this.setState({ todos });  // PureComponent 无法检测到变化};
}

4. 常见陷阱和解决方案

4.1 嵌套对象的比较

class NestedDataComponent extends React.PureComponent {state = {user: {profile: {name: 'John',age: 25}}};// 错误的更新方式wrongUpdate = () => {const { user } = this.state;user.profile.age = 26;  // 直接修改嵌套对象this.setState({ user });};// 正确的更新方式correctUpdate = () => {this.setState(prevState => ({user: {...prevState.user,profile: {...prevState.user.profile,age: 26}}}));};
}

4.2 数组更新

class ArrayComponent extends React.PureComponent {state = {items: [1, 2, 3]};// 错误的数组操作wrongArrayUpdate = () => {const { items } = this.state;items.push(4);  // 直接修改数组this.setState({ items });};// 正确的数组操作correctArrayUpdate = () => {this.setState(prevState => ({items: [...prevState.items, 4]}));};// 正确的过滤操作filterItems = (predicate) => {this.setState(prevState => ({items: prevState.items.filter(predicate)}));};
}

5. 最佳实践

5.1 何时使用 PureComponent

  1. 组件的 props 和 state 是简单数据类型
  2. 组件的渲染输出完全由 props 和 state 决定
  3. 组件需要频繁重渲染
  4. 组件的 props 和 state 变化频率较低

5.2 何时避免使用 PureComponent

  1. 组件的 props 经常变化
  2. 组件的渲染逻辑复杂
  3. 组件需要处理深层数据结构
  4. 组件依赖于外部状态或上下文

5.3 性能优化建议

// 1. 使用 memoization
class OptimizedComponent extends React.PureComponent {memoizedValue = memoize(value => expensiveOperation(value));render() {const processedValue = this.memoizedValue(this.props.value);return <div>{processedValue}</div>;}
}// 2. 合理拆分组件
class ParentComponent extends React.Component {render() {return (<div><PureChild1 data={this.props.data1} /><PureChild2 data={this.props.data2} /></div>);}
}

6. 总结

6.1 核心要点

  1. PureComponent 通过浅比较优化性能
  2. 适用于简单数据结构的场景
  3. 需要注意引用类型的处理
  4. 配合不可变数据使用效果最佳

6.2 使用建议

  1. 合理评估使用场景
  2. 避免内联对象和函数
  3. 正确处理复杂数据结构
  4. 注意性能优化的边界条件

相关文章:

React PureComponent使用场景

1. 基本概念 1.1 什么是 PureComponent PureComponent 是 React 提供的一个优化类组件&#xff0c;它通过自动实现 shouldComponentUpdate 生命周期方法&#xff0c;对 props 和 state 进行浅比较来决定是否需要重新渲染组件。 1.2 与 Component 的区别 // 普通 Component …...

初学者如何利用AI辅助编程快速搭建软件原型

在当今这个快速发展的科技时代&#xff0c;AI辅助编程已成为软件开发领域的一大助力&#xff0c;尤其在搭建软件原型阶段&#xff0c;更是能帮助开发者快速探索众多想法&#xff0c;创造出新事物。吴恩达老师最近分享了关于搭建简单Web应用原型的一些最佳实践&#xff0c;其中重…...

六、Angular 发送请求/ HttpClient 模块

一、应用 HttpClient 模块 angular/common/http 中的 HttpClient 类基于浏览器提供的 XMLHttpRequest 接口。要想使用 HtpClient 模块&#xff0c;就要先导入 Anqular 的 HttpClientModule。大多数 Web 应用程序都会在根模块 AppModule 中导入它。 编辑 src/app/app.module.ts…...

11_Redis数据类型-Geo地理位置

1.Geo地理位置介绍 1.1 基本概念 Redis中的GEO(Geographic)是一种专门用于处理地理位置信息的功能模块,自Redis 3.2版本引入。它特别适合用于LBS(基于位置的服务)应用,如查找附近的餐馆、用户或兴趣点等。Redis GEO的实现依赖于有序集合(sorted set),并且利用了Geoh…...

电脑每次开机卡到windows图标界面进不去

我遇到的现象是&#xff1a; 可以正常开机&#xff0c;也可以重装系统&#xff0c;主板电池换过&#xff0c;硬盘&#xff0c;内存也没问题&#xff0c;但每次开机都会卡到这个界面不动&#xff0c;也不崩溃&#xff0c;也进不去系统。最后的解决方法&#xff1a;换CPU&#x…...

如何将 DotNetFramework 项目打包成 NuGet 包并发布

如何将 DotNetFramework 项目打包成 NuGet 包并发布 在软件开发过程中&#xff0c;将项目打包成 NuGet 包并发布到 NuGet 库&#xff0c;可以让其他开发者方便地引用和使用你的项目成果。以下是将 WixWPFWizardBA 项目打包成 NuGet 包并发布的详细步骤&#xff1a; 1. 创建 .n…...

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构&#xff0c;然后再介绍世面上常见的产品 我们在大型的复杂的系统下&#xff0c;会有大量的跑批&#xff0c;定时任务的功能&#xff0c;如果在独立的子项目中单独去处理这些任务&#xff0c;随着业务的复杂度的提高…...

鸿蒙UI开发——日历选择器

1、概 述 在项目开发中&#xff0c;我们时常会用到日历选择器&#xff0c;效果如下&#xff1a; ArkUI已经为我们提供了组件&#xff0c;我们可以直接使用&#xff0c;下面针对日历组件做简单介绍。 2、CalendarPickerDialog 接口定义如下&#xff1a; // 定义日历选择器弹…...

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…...

【论文复现】量子海洋捕食者算法用于多级图像分割问题

目录 1.摘要2.海洋捕食者算法MPA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于量子理论的改进海洋捕食者算法&#xff08;QMPA&#xff09;&#xff0c;专门用于解决多级图像分割问题。QMPA算法利用薛定谔波函数中的概率函数来确定任何时刻粒子的位…...

【python自写包模块的标准化方法】

目标: 自写一个包,提供关于字符串和文件的模块 要求对异常可以检测 str_tools.py: def str_reverse(s):""":param s: 传入的字符串:return: 反转后的字符串"""# i -1# j 0# s2 ""# while i > (-len(s)):# s2 s[i]# …...

STL——二叉搜索树

目录 二叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 ⼆叉搜索树的删除 中序遍历结果为升序序列 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树 • 若它的左⼦树不为空&#…...

2025年XR行业展望:超越虚拟,融合现实

随着科技的飞速发展,扩展现实(XR)技术正逐渐从科幻走进日常生活。2025年,除了备受瞩目的AI百镜大战,XR行业同样充满期待,一系列创新产品和技术进步有望重塑我们对数字世界的体验。 Meta Quest 3S:VR行业的风向标 作为Meta旗下的拳头产品,Quest系列一直是VR市场的领军…...

python异常机制

异常是什么&#xff1f; 软件程序在运行过程中&#xff0c;非常可能遇到刚刚提到的这些问题&#xff0c;我们称之为异常&#xff0c;英文是Exception&#xff0c;意思是例外。遇到这些例外情况&#xff0c;或者交异常&#xff0c;我们怎么让写的程序做出合理的处理&#xff0c…...

JVM与Java体系结构

一、前言: Java语言和JVM简介: Java是目前最为广泛的软件开发平台之一。 JVM:跨语言的平台 随着Java7的正式发布&#xff0c;Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。 Java虚拟机根本不关心运行在其内部的程序到底是使用何…...

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如&#xff0c;int a 10;、printf("Hello, World!");。分号是语句的一部分&#xff0c;用于…...

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https&#xff1f; 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量&#xff1f; 2.HTTPS怎么解密&#xff1f; 部分app可以使用代理抓包的方式&#xff0c;但是正式点的app用代理抓包是抓不到的&#xff0c;例如pin检测&#xff0c;证书双向校验等…...

中学综合素质笔记3

第一章职业理念 第三节 教师观 考情提示&#xff1a; 单选题材料分析题 学习要求&#xff1a; 理解、 识记、 运用 &#xff08;一&#xff09;教师职业角色的转变&#xff08;单选材料分析&#xff09; 从教师与学生的关系看——对学生 新课程要求教师应该是学生学习的引…...

U盘加密软件哪个好用?免安装、安全、防复制

U盘作为一种便携式存储设备&#xff0c;因其携带方便、使用灵活而广受欢迎。然而&#xff0c;U盘的易失性也使其成为数据泄露的高风险载体。为了确保U盘中数据的安全性&#xff0c;使用专业的U盘加密软件是必不可少的。 免安装 更方便 《U盘超级加密3000》这款软件下载后直接…...

C++异常

1.C语言的错误处理方式 1.1直接终止程序 利用assert和exit都是直接终止程序。 1.2返回错误码 例如C语言程序的很对接口函数都会将错误信息存储在errno中表示错误。当我们自己设计函数时&#xff0c;函数返回值和返回错误码容易混淆&#xff0c;且如果函数调用栈较深时&…...

银河麒麟v10 arm版 鲲鹏 U盘安装 +解决 安装源 设置基础软件仓库时出错

人人为我&#xff0c;我为人人&#xff0c;分享出来&#xff0c;避免他人踩坑 U盘刻录 出现问题 进入系统安装界面&#xff0c;这里可以看到在“软件”-“安装源”选项上报错了&#xff0c;提示“设置基础软件仓库时出错” 2种解决办法 1. 有网的情况&#xff08;注意自己查地址…...

[network]回顾:集线器(Hub)

集线器&#xff08;Hub&#xff09;的发明是计算机网络发展史上的一个重要里程碑。它最初的设计目的是为了解决局域网&#xff08;LAN&#xff09;中多台计算机共享网络资源的需求。 #mermaid-svg-OAmOmKYGAXoglS5z {font-family:"trebuchet ms",verdana,arial,sans-…...

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…...

打桩机:灾害救援中的 “应急尖兵”,稳固支撑的保障|鼎跃安全

在自然灾害或突发事故中&#xff0c;如地震、泥石流、洪涝灾害、山体滑坡等&#xff0c;地质条件的不稳定可能导致建筑物倒塌、道路损毁、堤坝决口等情况&#xff0c;严重威胁人员和财产安全。 打桩机是一种用于将桩打入地基的重型机械设备&#xff0c;其主要功能是提供支撑力&…...

java1-相对路径与绝对路径

注意注意~开始新部分啦! 开始正式分享java前,先为大家分享一下一个常用的概念---文件的相对路径与绝对路径. 开篇明义: 相对路径是指一个文件或目录相对于当前工作目录的路径。相对路径不包含根目录&#xff0c;而是从当前目录开始计算。 绝对路径是指一个文件或目录从根目录…...

工厂管理中 BOM(物料清单)

工厂管理中 BOM&#xff08;物料清单&#xff09;的一些优点&#xff1a; 1. 提高生产计划准确性 - 准确反映产品所需的物料及数量&#xff0c;为生产计划提供可靠依据&#xff0c;减少因物料估算错误导致的生产延误。 2. 优化成本控制 - 有助于精确计算产品成本&…...

allure报告修改默认语言为中文

1、项目根目录创建.py文件&#xff0c;把代码复制进去 import os from pathlib import Pathdef create_settings_js_file(directory"../pytest_mytt/reports/allures/", filenamesettings.js):# 创建或确认目录存在Path(directory).mkdir(parentsTrue, exist_okTrue…...

浅谈弱电系统RVVP和RVSP电缆的区别(

1、RVVP 1.1RVVP电缆定义&#xff1f; RVVP电缆抗干扰软电缆、屏蔽电缆、信号电缆、控制电缆&#xff08;名字很多&#xff09;&#xff0c;学名&#xff1a;铜芯-聚氯乙烯绝缘-屏蔽聚氯乙烯护套-软电缆。 1.2RVVP执行标准 主要执行标准为JB/T8734.5-2016&#xff0c;部…...

MySQL 入门大全:常用函数

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

RV1126+FFMPEG推流项目(1)总体框架讲解

音视频推流项目的讲解 项目介绍 本项目通过 RV1126 采集摄像头和麦克风数据&#xff0c;采用 H.264/H.265 视频编码技术和 AAC 音频编码技术进行压缩和合成复合流&#xff0c;然后推送到流媒体服务器。 项目框图 下图展示了整个项目的总体流程图&#xff0c;核心部分包括&a…...

量子计算遇上人工智能:突破算力瓶颈的关键?

引言&#xff1a;量子计算遇上人工智能——突破算力瓶颈的关键&#xff1f; 在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活&#xff0c;从语音助手到自动驾驶&#xff0c;从医学诊断到金融分析&#xff0c;无不彰显其…...

Kafka消费者如何优雅下线

一、背景 我们在Kafka消费程序中&#xff0c;可能会调用dubbo接口&#xff0c;也可能会使用线程池&#xff0c;连接池等&#xff0c;但是在服务下线的时候&#xff0c;kafka的消费总是会报错。比如dubbo接口就会抛出异常RpcException: The channel is closed. 这说明kafka还在…...

Go语言的网络编程

Go语言的网络编程 Go语言&#xff08;又称Golang&#xff09;是一种由Google开发的开源编程语言&#xff0c;以简洁、高效和并发为主要特点。网络编程是Go语言的一个重要应用领域&#xff0c;其优秀的并发模型和丰富的标准库使得Go成为开发高性能网络应用的理想选择。本篇文章…...

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法

网络安全 | 网络安全法规&#xff1a;GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》&#xff08;GDPR&#xff09;2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》&#xff08;CCPA&#xff09;3.1 背景3.2 主要内…...

外部获取nVisual所在层级方法

Iframe嵌入nVisual&#xff0c;在iframe渲染完成之后&#xff0c;以后通过增加window.addEventListener()方法监听message事件&#xff0c;来获取nvisual当前的所在层级以及所选中的节点列表以及线缆列表。 nVisualPatrolDiagramIdList 变量是获取nVisual当前所在的层级的ID值…...

ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现

ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现 目录 ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现1. ARIMA模型概述1.1 时间序列预测1.2 ARIMA的优势2. ARIMA的核心技术2.1 自回归 (AR)2.2 差分 (I)2.3 移动平…...

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务&#xff08;Spring MVC Springboot&#xff09;同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题&#xff0c;因为已经处理…...

【深度学习量化交易13】继续优化改造基于miniQMT的量化交易软件,增加补充数据功能,优化免费下载数据模块体验!

我是Mr.看海&#xff0c;我在尝试用信号处理的知识积累和思考方式做量化交易&#xff0c;应用深度学习和AI实现股票自动交易&#xff0c;目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 MiniQMT是一种轻量级的量化交易解决方案&#xff0…...

【并发篇】CompletableFuture学习

CompletableFuture 异步编程 前言 我们异步执行一个任务时&#xff0c;一般是用线程池 Executor 去创建。 如果不需要有返回值&#xff0c;任务实现 Runnable 接口&#xff1b;如果需要有返回值&#xff0c;任务实现 Callable 接口&#xff0c;调用 Executor 的 submit 方法…...

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署

STM32-MBD&#xff08;1&#xff09;安装 Simulink STM32 硬件支持包 STM32-MBD&#xff08;2&#xff09;Simulink 模型部署入门 STM32-MBD&#xff08;3&#xff09;Simulink 状态机模型的部署 [STM32-MBD&#xff08;4&#xff09;Simulink 状态机实现按键控制] (https://bl…...

springCloudGateWay使用总结

1、什么是网关 功能: ①身份认证、权限验证 ②服务器路由、负载均衡 ③请求限流 2、gateway搭建 2.1、创建一个空项目 2.2、引入依赖 2.3、加配置 3、断言工厂 4、过滤工厂 5、全局过滤器 6、跨域问题...

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value&#xff0c;其基础数据类型都是字符串。如&#xff0c;Hash型value的field与value的类型&#xff0c;List型&#xff0c;Set型&#xff0c;ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…...

zephyr移植到STM32

Zephy如何移植到单片机 1. Window下搭建开发环境1.1 安装Choncolatey1.2 安装相关依赖1.3创建虚拟python环境1.4 安装west1.4.1 使用 pip 安装 west1.4.2 检查 west 安装路径1.4.3 将 Scripts路径添加到环境变量1.4.4 验证安装 1.5 获取zephyr源码和[安装python](https://so.cs…...

Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)

注&#xff1a;罗技鼠标&#xff0c;使用久了之后会出现连击现象&#xff0c;如果刚好过保了&#xff0c;可以考虑使用软件方案解决连击现象&#xff1a; 以下是示例AutoHotKey脚本&#xff0c;实现了调用XButton1用于关闭窗口&#xff08;以及WinW&#xff0c;XButton2也导向…...

案例研究:UML用例图中的结账系统

在软件工程和系统分析中&#xff0c;统一建模语言&#xff08;UML&#xff09;用例图是一种强有力的工具&#xff0c;用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究&#xff0c;详细解释UML用例图的关键概念&#xff0c;并说明其在设计结账系统中的应用。 用…...

将光源视角的深度贴图应用于摄像机视角的渲染

将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射&#xff08;Shadow Mapping&#xff09;技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下&#xff0c;并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…...

安卓漏洞学习(十八):Android加固基本原理

APP加固技术发展历程 APK加固整体思路 加固整体思路&#xff1a;先解压apk文件&#xff0c;取出dex文件&#xff0c;对dex文件进行加密&#xff0c;然后组合壳中的dex文件&#xff08;Android类加载机制&#xff09;&#xff0c;结合之前的apk资源&#xff08;解压apk除dex以外…...

前端数据模拟器 mockjs 和 fakerjs

功能&#xff1a;帮助前端生成随机数据&#xff0c;独立于后端单独开发 一、mockjs 安装&#xff1a;npm install mockjs 优点&#xff1a;官网是中文。 缺点&#xff1a;目前该库已经无人维护&#xff0c;也没人解决github上的bug。 官网 github地址 二、fakerjs 安装&#xf…...

Ruby语言的软件开发工具

Ruby语言的软件开发工具概述 引言 Ruby是一种简单且功能强大的编程语言&#xff0c;它以优雅的语法和灵活性而闻名。自1995年首次发布以来&#xff0c;Ruby已经被广泛应用于各种开发领域&#xff0c;特别是Web开发。随着Ruby语言的普及&#xff0c;相关的开发工具也日益丰富。…...

P8772 [蓝桥杯 2022 省 A] 求和

题目描述 给定 &#x1d45b; 个整数 &#x1d44e;1,&#x1d44e;2,⋯ ,&#x1d44e;&#x1d45b; 求它们两两相乘再相加的和&#xff0c;即 &#x1d446;&#x1d44e;1⋅&#x1d44e;2&#x1d44e;1⋅&#x1d44e;3⋯&#x1d44e;1⋅&#x1d44e;&#x1d45b;&…...