iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >提高React界面性能的十个技巧
  • 387
分享到

提高React界面性能的十个技巧

2024-04-02 19:04:59 387人浏览 泡泡鱼
摘要

目录shouldComponentUpdatePureComponentuseEffect用React.memo提供记忆窗口化(列表虚拟化)函数缓存延迟加载和代码拆分并发模式、Sus

总的说来,React是通过维护视图中的内存(in-memory)模型来运作的。这通常被称为虚拟DOM,它可以被用来确定实际DOM何时需要被更新。不过,由于操控实际DOM的成本较高,因此我们需要确保仅在必要时才去更新DOM,进而提高整体性能。

为了从React框架中获取最高性能,并提升React界面的响应效率,本文将从各种功能函数(如Suspense)、以及基于类的组件出发,和您讨论十项常用的、面向DOM的技术与方法。

shouldComponentUpdate

在编写基于类的组件时,您可以重写shouldComponentUpdate()的生命周期方法。该方法的目的在于:明确地声明目标组件是否需要被重新渲染(re-rendering)。值得注意的是,在更新实际DOM的生命周期中,渲染的开销是非常巨大的。因此,只有在组件的属性(props)或状态(states)发生变化时,我们才需要让React执行渲染。有时您甚至可以跳过渲染,以避免整体调用所产生的开销。

shouldComponentUpdate的签名和操作比较简单。在如下简单示例中,组件需要知晓应该在何种指定触发条件下,去执行更新。该方法将接收到的属性与状态当作参数,如果返回为true,组件将执行渲染,否则并不触发渲染。


shouldComponentUpdate(nextProps, nextState) { 
    if (this.props.significant !== nextProps.significant) { 
      return true; 
    } 
    return false; 
  } 

虽然上述代码段主要检查的是属性,但是它对于状态也同样适用。当然,在实际应用中,对于属性或状态的检查,并判定是否返回true,可能会更加复杂。如果您需要比较某个简单的浅层值(shallow value),那么请使用下一个技巧--PureComponent。

PureComponent

如果您的组件仅需要对属性和状态进行简单的浅层比较(shallow comparison,https://stackoverflow.com/a/5703797/467240),以确定是否需要渲染,那么完全可以使用PureComponent之类的扩展基类--class MyComponent extends React.PureComponent。它可以实现:当通过浅层比较,并未发现属性或状态发生了任何变化时,render()就不会被调用。顾名思义,PureComponent表示:仅在属性或状态改变时,才会触发输出的更改,因此该组件是纯净的,不会带有任何副作用。

useEffect

前面的技巧仅适用于那些基于类的组件。为了达到与常规功能性组件相似的效果,您可以使用useEffect hook和memo之类的功能性组件。其中,useEffect与shouldComponentUpdate有着相似的效果,它允许用户指定:仅在某些变量发生更改的情况下,生效某种特定的功能,从而避免了整体变更的开销。下面是一个简单的useEffect示例:


const MyComponent = (props) => { 
  useEffect(() => { 
    console.info("Update Complete: " + props.significantVariable); 
  }, [props.significantVariable]); 
} 

由上述代码段可知,如果props.significantVariable已被更改(即变量发生了变化),那么该代码就会运行生效。

用React.memo提供记忆

作为一个高阶组件,memo包装了各种组件,并扩展了它们的行为能力。也就是说,如果功能性组件具有相同的属性,memo便能够以缓冲的方式,“记住”它们的结果。据此,它可以有效地防止功能性组件在无视属性是否一致的情况下,去盲目地执行渲染。

为了模仿PureComponent只关注属性的行为,我们可以使用如下代码段来包装某些功能性组件,使其只检查属性的更改,而非状态。由于属性和状态是不同的,因此通过比较,一旦props.quote被认定为未发生改变,则其对应的组件也不会重新渲染。


const MyComponent = (props) => { 
  return <span>props.quote</span> 
} 
export default React.memo(SomeComponent) 

同时,React.memo 可以通过第二个参数,来检查函数的等效性:


export default React.memo(MyComponent, (oldProps, newProps) => {} ); 

通过上述代码,我们可以实现对用例新的和旧的属性进行比较。如果属性相等,该函数则返回true。值得注意的是,这与我们在前面介绍的shouldComponentUpdate,在发现组件出现更新时返回true,正好相反。

窗口化(列表虚拟化)

现在,让我们将注意力转移到一项同时适用于功能性和类组件的技术--窗口化(windowing)上。例如有一个具有数千行记录的数据表或列表,如果您想在该表所对应的应用界面上显示大量数据集,那么就需要采用“窗口化”的方式来查询数据。也就是说,我们可以通过一次性仅加载和显示部分数据的形式,防止大量数据“卡死”应用的用户界面(UI)。为此,我们时常可以用到react-window库(请参见--Https://GitHub.com/bvaughn/react-window)。

函数缓存

如果您觉得函数调用的成本过高,那么可以考虑对其进行缓存。如果各个参数相同,而且缓存能够返回结果,我们就可以使用存储式缓存(memorized cache)的方式,来避免各种针对数据获取的调用。当然,函数缓存是否真的适用,还取决于函数的具体特征。

延迟加载和代码拆分

所谓延迟加载是指:我们仅在必要时,才去加载数据。React 16.6引入了React.lazy(),它允许用户对代码按需进行拆分。这意味着,您可以在使用常规组件语法的同时,获得各种延迟加载的语义。

当然,React 16.6之前的版本,并非无法实现代码拆分,只是在处置大型代码库时,相对比较繁琐。

并发模式、Suspense和useDeferredValue

作为React 16的一项最显著的新功能,并发模式可以让用户通过使用Suspense组件,实现数据获取和渲染的并行处理,进而极大地提高应用程序的实际感知性能。

我们除了能够用Suspense组件来定义数据的获取区域之外,还可以使用诸如useDeferredValue等由React 16带来的新组件,来提升自动建议(auto-suggest)等工作方式,进而避免用户碰到诸如错误性的键入等不良的体验。

数据获取的防抖(Debounce)和限流(throttle)

大多数情况下,我们可以通过debounce或throttle函数,来更好地处理React的并发模式。如果您的代码库被定为旧版的渲染引擎,而无法开启并发模式时,此类函数便可以有效地避免在数据获取的过程中,出现混乱的局面。

例如,如果您想在用户键入数据的同时,实时地获取他们的输入,那么由于每个击键都会触发一个请求,因此整体的性能会大打折扣。对此,我们便可以使用debounce或throttle函数,来缓解此类问题。

分析(Profiling)

除了上面提到的技术,我们还可以通过对应用程序进行性能分析,来获悉性能瓶颈的所在,并验证上述改进方法的实际效果。目前,像Chrome和Firefox之类的浏览器,都带有内置的分析器(profiler)。一旦启用了React的开发模式(dev mode),您将可以通过分析器,来查看某些正在使用的特定组件。这对于检查网络的状态,以及识别后端调用的延迟,都是非常实用的。据此,您可以清晰地判断出,到底是前端javascript的代码问题,还是存在着需要后端修复的缺陷。

此外,React 16.5以及更高的版本,还提供了一个名为DevTools Profiler(https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)的工具。它既能够为处于并发模式的各个函数,提供了更加详尽的服务功能与集成;又可以通过多种方法,对应用程序的行为活动进行切片(slice)和切块(dice)。

另一类Profiler组件则能够展现组件渲染生命周期中的各种详细信息。

React的生产环境构建

最后,在部署生产环境时,您还需要确保生产环境构建(production build)的精简性、且不包含任何开发调试过程中的日志记录。当然,具体步骤取决于您所使用的构建工具。

以上就是提高React界面性能的十个技巧的详细内容,更多关于提高React界面性能的资料请关注编程网其它相关文章!

--结束END--

本文标题: 提高React界面性能的十个技巧

本文链接: https://www.lsjlt.com/news/125874.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 提高React界面性能的十个技巧
    目录shouldComponentUpdatePureComponentuseEffect用React.memo提供记忆窗口化(列表虚拟化)函数缓存延迟加载和代码拆分并发模式、Sus...
    99+
    2024-04-02
  • 如何提高React界面性能
    这篇文章主要介绍了如何提高React界面性能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。总的说来,React是通过维护视图中的内存(in-memory)模型来运作的。这通常...
    99+
    2023-06-15
  • Javascript之提高React性能的技巧
    目录1.解决重复渲染问题2.通过拆分组件减少重新渲染3.什么是实例重创建,如何避免?4.不要偷懒懒加载5.何时使用 React 片段?6.避免在列出的元素中使用索引作为键7.避免Sp...
    99+
    2023-05-15
    Javascript提高React性能 提高React性能技巧 React性能技巧
  • 提高PHP-FPM性能的十大技巧
    PHP-FPM是一个高性能的PHP FastCGI管理器,它能够提供稳定和高并发的PHP请求处理能力。然而,在实际应用中,我们常常需要进一步提升PHP-FPM的性能,以满足高负载的需求。本文将介绍十大优化技巧,包括具体的PHP代码示例,帮助...
    99+
    2023-10-21
    调整进程池大小 (adjusting process pool size) 优化PHP代码 (optimized PHP
  • HTML5 Canvas的性能提高技巧
    这篇文章主要讲解了“HTML5 Canvas的性能提高技巧”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5 Canvas的性能提高技巧”吧! ...
    99+
    2024-04-02
  • Python性能调优的十个小技巧总结
    目录1 多多使用列表生成式2 内置函数3 尽可能使用生成器4 判断成员所属关系最快的方法使用 in5 使用集合求交集6 多重赋值7 尽量少用全局变量8 高效的itertools模块9...
    99+
    2024-04-02
  • 提高代码性能的技巧有哪些
    这篇文章主要介绍“提高代码性能的技巧有哪些”,在日常操作中,相信很多人在提高代码性能的技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”提高代码性能的技巧有哪些”的疑惑...
    99+
    2024-04-02
  • Java 中高效的 XML 处理:提高性能的技巧
    引言: 处理 XML 数据在各种 Java 应用程序中都是一项常见任务。为了确保流畅的性能和响应性,优化 XML 处理过程至关重要。本文将提供一系列技巧,帮助开发人员提高 Java 应用程序中 XML 处理的效率和性能。 使用 SAX 解...
    99+
    2024-03-07
    XML、Java、SAX、DOM4J、StAX、性能、优化
  • Java 中的5个代码性能提升技巧
    目录1.预先分配HashMap的大小2.优化HashMap的key3.不使用Enum.values()遍历4.使用Enum代替String常量5.使用高版本JDK前言: 提示:我们不...
    99+
    2024-04-02
  • 使用PHP-FPM的技巧来提高网站性能
    随着Web应用程序的复杂性和用户量的增加,优化网站性能变得越来越重要。PHP-FPM(FastCGI Process Manager)是一个用于管理PHP进程的工具,它可以帮助我们有效地提升网站的性能和吞吐量。在本文中,我们将介绍一些使用P...
    99+
    2023-10-21
    技巧 php-fpm 网站性能
  • 提高 Python 代码可读性的五个基本技巧
    Python 中有许多方法可以帮助我们理解代码的内部工作原理,良好的编程习惯,可以使我们的工作事半功倍!例如,我们最终可能会得到看起来很像下图中的代码。虽然不是最糟糕的,但是,我们需要扩展一些事情,例如:load_las_file 函数中的...
    99+
    2023-05-14
    Python 函数 技巧
  • 提高Python代码可读性的五个基本技巧
    译者 | 赵青窕审校 | 孙淑娟你是否经常回头看看6个月前写的代码,想知道这段代码底是怎么回事或者从别人手上接手项目,并且不知道从哪里开始这样的情况对开发者来说是比较常见的。Python中有许多方法可以帮助我们理解代码的内部工作方式,因此当...
    99+
    2023-05-14
    代码 Python 技巧
  • JavaScript React 中的性能优化技巧:提升应用流畅度
    React 是一种流行的 JavaScript 库,用于构建用户界面。为了确保 React 应用程序的流畅性和最佳性能,至关重要的是采用适当的优化技术。 1. 虚拟 DOM (Virtual DOM) React 采用虚拟 DOM 来跟踪...
    99+
    2024-04-02
  • 提高Python代码可读性的5个技巧分享
    目录1. Comments2. Explicit Typing3. Docstrings (Documentation Strings)4. Readable Variable Na...
    99+
    2024-04-02
  • 提升CMS移动端SEO性能的10个技巧
    1. 使用响应式设计 响应式设计是一种网站设计技术,可以使网站在不同设备上都能获得良好的显示效果。对于移动端SEO来说,使用响应式设计可以确保网站在移动设备上也能正常打开和浏览,从而提高移动端用户体验。 2. 优化页面加载速度 页面加载...
    99+
    2024-02-11
    CMS 移动端 SEO 性能 优化 加载速度 安全性 结构化数据 响应式设计 AMP
  • 有哪些提高代码性能的编程小技巧
    这篇文章主要介绍“有哪些提高代码性能的编程小技巧”,在日常操作中,相信很多人在有哪些提高代码性能的编程小技巧问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些提高代码性能的编程小技巧”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • ASP Web API 高级技巧:提升 API 性能和安全性
    1. 使用缓存 缓存可以显著提高 API 的性能,因为它可以减少数据库访问的数量和延迟。ASP Web API 提供了多种缓存选项,包括: 内存缓存: 内存缓存将数据存储在服务器的内存中,这使得数据可以快速访问。内存缓存适用于经常访问...
    99+
    2024-02-24
    ASP Web API 性能 安全性 缓存 优化请求 响应 SSL 证书 安全实践
  • Java JNDI 性能优化技巧:如何提高 Java JNDI 的性能和效率
    1. 使用连接池 连接池是优化 Java JNDI 性能的有效方法之一。连接池通过预先创建和维护一定数量的数据库连接,以便应用程序随时使用,从而减少了创建新连接的开销。 // 创建连接池 ConnectionPool pool = ne...
    99+
    2024-02-24
    Java JNDI 性能优化 连接池 缓存 线程安全性
  • 9个提高 Python 编程的小技巧
    目录01 交换变量02 字典推导和集合推导03 计数时使用Counter计数对象04 漂亮的打印出JSON05 解决FizzBuzz06 连接07 数值比较08 同时迭代两个列表09...
    99+
    2024-04-02
  • 提高开发效率和性能的Vue技巧有哪些
    本篇内容主要讲解“提高开发效率和性能的Vue技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“提高开发效率和性能的Vue技巧有哪些”吧!1. 巧用$attrs和$listeners$att...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作