首页 > 其他分享 >react 性能优化

react 性能优化

时间:2024-05-09 10:02:06浏览次数:17  
标签:React return name 性能 react user props 组件 优化

一 纯组件
1 使用shouldComponentUpdate对先前的状态和 props 数据与下一个 props 或状态相同,如果两次的结果一直,那么就return false

  1. 使用纯净组件,pureComponent
    PureComponents 负责 shouldComponentUpdate——它对状态和 props 数据进行浅层比较(shallow comparison),如果先前的状态和 props 数据与下一个 props 或状态相同,则组件不会重新渲染。
    在 class component 时代,为了性能优化我们经常会选择使用 PureComponent,每次对 props 进行一次浅比较,当然,除了 PureComponent 外,我们还可以在 shouldComponentUpdate 中进行更深层次的控制

3 什么是浅层渲染?
在对比先前的 props 和状态与下一个 props 和状态时,浅层比较将检查它们的基元是否有相同的值(例如:1 等于 1 或真等于真),还会检查更复杂的 JavaScript 值(如对象和数组)之间的引用是否相同。
比较基元和对象引用的开销比更新组件视图要低。因此,查找状态和 props 值的变化会比不必要的更新更快。

import React from 'react';
export default class ApplicationComponent extends React.Component {
constructor() {
super();
this.state = {
name: "Mayank"
}
}
updateState = () => {
setInterval(() => {
this.setState({
name: "Mayank"
})
}, 1000)
}
componentDidMount() {
this.updateState();
}
render() {

    console.log("Render Called Again")
    return (
        <div>
            <RegularChildComponent name={this.state.name} />
            <PureChildComponent name={this.state.name} />
        </div>
    )
}

}
class RegularChildComponent extends React.Component {
render() {
console.log("Regular Component Rendered..");
return

{this.props.name};
}
}
class PureChildComponent extends React.PureComponent {
// Pure Components are the components that do not re-render if the State data or props data is still the same

render() {
    console.log("Pure Component Rendered..")
    return <div>{this.props.name}</div>;
}

}
在上面的示例中,状态被传播到子组件 RegularChildComponent 和 PureChildComponent。PureChildComponent 是一个纯组件。setstate 在一秒的间隔之后被调用,这将重新触发组件的视图渲染。由于初始 props
和新 props 的值相同,因此组件(PureChildComponent)不会被重新渲染。状态的浅层比较表明 props 或状态的数据没有变化,因此不需要渲染组件,从而提升了性能。

二 使用 shouldComponentUpdate 生命周期事件
这个函数将 nextState 和 nextProps 作为输入,并可将其与当前 props 和状态做对比,以决定是否需要重新渲染。
shouldComponentUpdate(nextProps, nextState) {
if(nextState.age != this.state.age || netState.name = this.state.name) {
return true;
}
return false;

三 React.memo 进行组件记忆(React.memo 是一个高阶组件)
它很像 PureComponent,但 PureComponent 属于 Component 的类实现,而“memo”则用于创建函数组件。
// The following function takes "user" Object as input parameter in props
function CustomisedComponen(props) {
return (


User name: {props.user.name}
User age: {props.user.age}
User designation: {props.user.designation}

)
}
function userComparator(previosProps, nextProps) {
if(previosProps.user.name == nextProps.user.name ||
previosProps.user.age == nextProps.user.age ||
previosProps.user.designation == nextProps.user.designation) {
return false
} else {
return true;
}
}
var memoComponent = React.memo(CustomisedComponent, userComparator);
React.memo 可以利用第二个函数参数进行更精准的控制。如果我们将对象引用作为 props 传递给 memo 组件,则需要一些自定义登录以进行比较。在这种情况下,我们可以将比较函数作为第二个参数传递给 React.memo 函数。假设 props 值(user)是一个对象引用,包含特定用户的 name、age 和 designation。这种情况下需要进行深入比较。我们可以创建一个自定义函数,查找前后两个 props 值的 name、age 和 designation 的值,如果它们不相同则返回 false。

四 使用 useMemo() 进行细粒度性能优化
上面 React.memo() 的使用我们可以发现,最终都是在最外层包装了整个组件,并且需要手动写一个方法比较那些具体的 props 不相同才进行 re-render;

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useMemo() 返回的是一个 memoized 值,只有当依赖项(比如上面的 a,b 发生变化的时候,才会重新计算这个 memoized 值)

参考文献: https://blog.csdn.net/m0_65121454/article/details/132366339
https://baijiahao.baidu.com/s?id=1757722501241325874&wfr=spider&for=pc

标签:React,return,name,性能,react,user,props,组件,优化
From: https://www.cnblogs.com/zw100655/p/18181465

相关文章

  • react里面bind与箭头函数
    bind由于在类中,采用的是严格模式,所以事件回调的时候,会丢失this指向,指向undefined,需要使用bind来给函数绑定上当前实例的this指向;箭头函数的this指向上下文,所以永久能拿到当前组件实例,this指向,我们可以完美的使用箭头函数来替代传统事件处理函数的回调箭头函数class......
  • 【性能监控命令_01】vmstat
    vmstat命令这个命令比较强大,先来看执行结果 字段解析r:第一列的监控数据,表示目前实际在运行在队列,通熟一点就是还有多少任务在等待CPU来执行,从上图看出r列下面都是0,所以当前这台服务器上暂时还没任务运行。若r列这个值,超过了CPU的核数,就表示当前CPU可能存在瓶颈,当然在判断......
  • 关系代数与逻辑优化规则 (一): 定义
    作者:zhuwenzhuang,2024.05.08.阅读前假设读者熟悉数据库使用,了解SQL的语法和关系算子的大概含义,能通过EXPLAIN命令查看数据库执行计划.0前言数据库优化器的查询优化(QueryOptimization)指在查询等价的前提下,将代价更高的查询转化为代价更低的查询的过程.查询......
  • MySQL-09.性能分析工具的使用
    1.数据库服务器的优化步骤当遇到数据库调优问题时,思考的流程如下图。整个流程划分成了观察(Showstatus)和行动(Action)两个部分。字母S的部分代表观察(会使用相应的分析工具),字母A代表的部分是行动(对应分析可以采取的行动)。上图,就是数据库调优的思路。如果发现执行SQL时存......
  • libvips 一个最好用的高性能、低内存、跨平台的图片处理库
    一个可以媲美OpenCV的开源库,它具有高性能、低内存、跨平台、无内存泄漏的特性。项目简介这是用C++开发的图像处理库,支持的API超过300多个,涵盖了算术、颜色、图片转换、卷积、形态、马赛克、合并、切割等。支持多种图像格式,包括:JPEG、JPEG2000、JPEG-XL、TIFF、PNG、WebP、HEIC......
  • ExcelDataReader:一个.Net高性能Excel开源读取器
    ExcelDataReader:一个.Net高性能Excel开源读取器来自:编程乐趣推荐一个用于读取MicrosoftExcel文件的高性能开源库。 01项目简介ExcelDataReader是一个功能强大且易于使用的开源项目,提供了丰富的读取API,专门读取Excel文件的数据,特别是处理大数据量的情况。ExcelDataReader......
  • 高效C#编程:通过智能线程池管理提升性能
    前言C#编程中,线程池(ThreadPool)是一个重要的概念,它允许开发者更有效地管理和利用系统资源。通过线程池,我们可以避免频繁地创建和销毁线程,从而减少系统开销并提高程序的响应速度和吞吐量。在软件开发中,效率是关键,无论你是在开发一个简单的应用程序还是一个复杂的系统。为了创建一......
  • react理论总结1
     1)对react的理解(特点)1,Jsxjs+xml,是对js语法的扩张,需要通过babel.js的编译转化成浏览器可以解析的普通js对象2,虚拟dom。相当于在js和真实dom之间的缓存,state改变调用render函数会重新生成新的虚拟dom树,通过diff算法计算出新旧dom差异 只能差异部分更新到真实的dom,减少......
  • ES索引数据迁移、分片数优化(reindex)
    目录ES索引数据迁移、分片数优化(reindex)业务背景步骤新建索引将原索引数据复制到新索引中校验结果删除原索引给新索引起别名创建新索引的metric脚本整合使用感受ES索引数据迁移、分片数优化(reindex)​ Elasticsearch是⼀个实时的分布式搜索引擎,为⽤户提供搜索服务。当我们创建好......
  • httpstat:测量HTTP请求的性能和状态信息
    Github地址:https://github.com/reorx/httpstatHTTP(HypertextTransferProtocol)是互联网上应用最广泛的协议之一,用于在客户端和服务器之间传输数据。在开发和维护Web应用程序时,了解HTTP请求和响应的性能和状态信息非常重要。Pythonhttpstat是一个强大的命令行工具,用于深入了解H......