ReactJS修炼之路(四):组件的性能优化及开发思路

高阶移动端开发工程师的修炼之路——从技术栈到架构思维 珠海步天歌科技招聘移动端开发工程师,要求5年以上iOS/Android开发经验,精通ReactNative与原生模块集成、性能调优。核心技能包括:深入理解Android系统机制(RunLoop、内存管理等),掌握MVVM架构和响应式编程,具备分布式系统概念和后端协作能力。职位强调复杂问题解决能力、代码质量意识及团队协作精神,需持续关注技术动态。工作地点为佛山、深圳、广州,面向具备技术深度和架构视野的高阶开发者。 阅读详情

少年,加油

昨天周五,那个喊我“少年”的朋友离职了去新加坡了,我的实习生涯又错过了一位大神,不过短短一个月还是被影响不少,例如入坑happy hacking keybord同时学习各类软件的快捷键,例如开始用sass,例如初次使用
flexbox…

人生何处不相逢,谢谢你的指导,我会更加努力,也祝你更进一步,加油。


回看,事情总有千丝万缕的联系,但是往前,都是迷雾,保持迷茫,保持思考,做好现在,是我最大的感悟。

之所以要说上面那些,是和这篇博客相关的,写React也有半年多了,虽然都是零零散散地写并没有太多提高,但实践总是好的,例如今天在做一个项目的首屏性能优化的时候,就顿悟了一些开发思路,感觉过去看到各种博客,与人交流的各种想法都零星地串联了起来。

下面简单分享一下我的组件优化思路及开发思路,不是最佳实践,只是个人一些感触。


缘由

昨晚开始看React后端渲染的内容,其实项目的第一版就是纯后端渲染的,后来使用React-router改版成SPA,再后来进行了前后端分离,方便前端人员开发,因为后台是Rails,虽然也可以搞同构,不过支持rails的react-router版本太低(现在前端部分是webpack构建的),不好往回迁。

也想了一些方案,例如使用首屏后端模板渲染,同时加载前端资源,前端渲染完毕后替换首屏内容,实现起来不优雅,放弃了。

忽然想到,产品最重要的是体验,说不定加载慢(2.5s)并不是体验的最短板呢?

于是先不考虑后端渲染,但也做了一些微小的改进,后端页面返回显示loading效果(svg实现loading),前端渲染完成后,会有一个缩放渐现的过程,整体体验还不错,gif制造帧率低看着效果一般,在手机上超赞,安卓手机SVG动画有点卡,待调研解决。
web app首页加载效果

在拿不同手机测试这个首屏加载效果的时候,无意中发现,这个web应用首屏操作不够流畅,于是就甩开手上的6s,借了舍友淘汰下来安卓机做测试,真是卡到不行。

忽然觉得前端工程师就应该用落后两年左右的手机,这样才能真正确保产品质量。(开个玩笑,别在意)


优化思路

最近在网上看到一份谷歌的web app开发教程,内容比较多,还没看完,所以还不知道怎么评测性能,目前最直观的就是,加载速度(白屏时间),操作流畅度。

我的思路很简单,也很有效,直接在各个组件的render函数里console.log("xxx render")到控制台,观察每个组件的渲染次数,减少不必要的渲染。

下面总结一下,什么情况下会出现不必要的render,怎么减少。

  1. 父组件里面的子组件排序引起子组件render,其实这个时候子组件的内容是没有任何改变的,只是子组件所在的位置改变而已,按理说子组件是不需要render的。解决方法:shouldComponentUpdate,判断内容不变就跳过更新,如果内容是一直不变的,推荐直接return false,省去判断的成本。

  2. 有些组件会先加载,再异步请求数据,再重新渲染,会出现两次render(不推荐这种做法,下文将开发思路会讲到),解决方案,在render函数里面进行判断,如果没有数据,直接return <div>没有数据时候的提示信息</div>

还有一个小小的点:

  • React组件render很频繁,所以render函数里面尽量减少操作,例如:
//每次都会循环生成相同的内容,性能差
<div className="swiper-pagination">
{
  [1,2,3].map( function(i) {
    return <span className="swiper-pagination-bullet"></span>
  } )
}
</div>

//性能要好一些
<div className="swiper-pagination">
  <span className="swiper-pagination-bullet"></span>
  <span className="swiper-pagination-bullet"></span>
  <span className="swiper-pagination-bullet"></span>
</div>

上面只提到了两种情况和方案,把这两个做好性能应该不是大的问题了,总之,核心还是,找到不必要的render,尽量避免。


开发思路

simple is the best.

正因为做性能优化才有了组件开发思路的感悟和改进,真觉得以前是随便乱写,哈哈,不过厉害的地方在于,随便乱写的代码竟然能运行,但人终归要成长,标准也在提高。

说开发思路之前,有空的同学先去温习React组件生命周期,这个非常重要。

之前看过一段时间Redux,对于里面的容器组件和展示组件并不是太了解,然而今天好像有点能体会什么是容器组件和展示组件了,简而言之,展示组件只做展示,容器组件封装了数据获取和数据操作的逻辑(没有上手redux,望指正)。

下面直接上展示组件的代码(旧的react代码风格,别吐槽):

var component = React.createClass({
  getInitialState: function() {
    //状态初始化(第一轮执行)
    //可用于类型检查
  },
  componentDidMount: function() {
    //组件加载完成执行的动作(第一轮执行)
  },
  componentWillReceiveProps: function(nextProps) {
    //props更新,用于设置state(第二轮开始执行)
    //注意,这里setState并不会引发新的一轮更新
  },
  shouldComponentUpdate: function() {
    //决定组件是否更新(第二轮开始执行)
    return false/true;
  },
  render: function() {
    //渲染内容
    console.log("render");
  }
});

上面几个生命周期函数摆放的位置是特意调整的,现在我们来走一遍流程,父组件通过设置子组件的props传递数据,此时组件调用getInitialState,初始化状态,然后组件执行render完成渲染,展示组件就是那么简单,到这里只是渲染了一次,这个时候,父组件要是再次render,会影响到子组件,子组件会调用componentWillReceiveProps来更新组件状态,再调用shouldComponentUpdate来确定是否跳过render。遵循这个开发思路不仅能使开发的时候保持清晰的逻辑,也在开发的时候保证了组件的性能,不用想我上面那样修修补补。


总结

  • 多看官博,了解核心思想
  • 多写代码,不止于demo,去写项目,去解决问题

以前总喜欢问别人最佳实践,后来发现,如果你去问别人,那别人告诉你多半也听得一知半解。

规划重要,实践也重要,最重要的是在已有前提下想办法做到自己想要的效果,而不是抱怨自己当初没考虑周全,生活也是如此。

写码路上没有捷径,去创造,去超越,少年。

SAP高级外币评估_FINS_FXV_S4 2022 OP 摘要:S/4HANA 2022 On-Premise中的高级外币评估(FINS_FXV)取代了经典外币估值(FAGL_FCV),提供更优化的财务结算功能。主要创新包括:增量发布逻辑、简化账户配置、行项目级估值可见性等。该功能支持IFRS9等会计准则,通过会计原则(Accounting Principle)进行配置,需完成财务报表版本定义、语义标记分配等必要设置。系统演示展示了从汇率维护(FB60/MIRO)、测试运行到最终过账(FB03)的完整流程,能自动计算并过账汇率差异。高级外币评估简化了期末结算操作, 阅读详情

相关推荐

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8888

react组件优化,如何避免没有必要的render导致性能浪费

前言 在开发过程中,肯定会出现层层嵌套的关系组件,当我们使用Component时,父组件中的state或者props发生更新时,无论子组件中的state和props是否更新,都会触发子组件的更新,会导致很多没有必要的render,浪费很多性能。今天这这篇文章就教大家如何来解决这个问题 问题重现 先来看如下代码案例: 应该比较好理解,页面中引入了三个组件,然后点击按钮会触发state的改变 import React, { Component } from 'react' export class Root

weixin_45745641的博客 2006

从拆解图看懂空心杯电机:有刷 vs 无刷内部结构全解析(附DIY注意事项)

本文深入解析有刷与无刷空心杯电机的内部结构差异,通过高清拆解图展示关键部件工艺特点,并分享实用的维护技巧和检测方法。重点对比两种电机在效率、寿命和适用场景上的优劣,为DIY爱好者提供详细的注意事项和操作指南。

xgboost6farmer的博客 516

React性能优化,六个小技巧教你减少组件无效渲染

在过去的一段时间,我一直围绕项目中体验不好或者无效渲染较为严重的组件做性能优化,多少积累了一些经验所以想着整理成一片文章,下图就是优化后的一个组件,可以对比优化前一次切换与优化后多次切换的渲染颜色深度与按钮的切换速度:关于减少组件无效渲染,与其说是提几点建议,不如说是在优化过程中所记录的一些不规范的写法,能写出更好的代码总是更棒的,也希望这几点建议能对大家能有些许帮助。当然,以下建议不管class组件还是hooks中其实都会犯,所以都有参考意义,那么本文开始。......

行星飞行的博客 1725

【LaTex】LaTex的下载与安装(2025新手小白超详细、超简洁 Windows系统)

安装地点(1)texlive的安装:首先打开下载好的安装包,找到这个文件前面缺少了一页emm我去截取其他人的作为示范然后点击安装安装时间较久,大概要一个小时左右。具体要看个人电脑性能情况。如图显示如上图,则安装成功。图中是TeXstudio 4.8.7版本针对不同操作系统和使用场景的安装包 ,区别如下:(按需求下载)

爱学习的capoo的博客 5097

三极管吸潮失效分析案例

案例背景三极管也称为晶体三极管,它被视为电子电路中最重要的器件之一。三极管顾名思义具有三个电极,它最主要的功能是电流放大和开关作用。本次失效案例中的三极管在仓库存放一段时间后,在PCBA测试过程中集中发生不良。分析过程1.外观检测对失效样品进行外观检测,未发现明显破损、裂纹等不良。2.X-ray检测对失效样品进行X-ray检测,金线、绑定点未发现异常。3.开封检测对失效样品进行开封检测,发现存在键合点脱落的现象,键合点附近的晶圆破损。4.SEM检测对失效样品进行SEM检测,发现晶圆键合点位置有裂纹和破损,金

sy220504的博客 1042

React中如何避免不必要的render?

在 React 类组件中,可以利用 shouldComponentUpdate或者 PureComponent 来减少因父组件更新而触发子组件的 render,从而达到目的。此时需要采取一些措施来提升运行性能,其很重要的一个方向,就是避免不必要的渲染(Render)。React.memo 是 React 16.6 新的一个 API,用来缓存组件的渲染,避免不必要的更新,其实也是一个高阶组件,与 PureComponent 十分类似,但不同的是, React.memo只能用于函数组件。

DHLSP15的博客 856

手把手教你用Ubuntu Base 20.04打造轻量级ARM开发板根文件系统(附常见问题解决)

本文详细介绍了如何基于Ubuntu Base 20.04 LTS构建轻量级ARM开发板根文件系统,涵盖环境准备、镜像制作、跨架构配置、软件包定制及常见问题解决。通过实战指南,开发者可快速掌握ARM架构下的根文件系统构建技巧,优化系统性能并解决部署中的典型问题。

gin88的博客 210

谈谈react中的性能优化

文章主要介绍了 React 组件性能优化的五种方式,包括跳过不必要组件的更新、列表项使用 key 属性、批量更新,减少 Render 次数、组件懒加载、避免内联函数等。

2301_79459824的博客 3001

SWAT模型非点源模拟原理

目录引言模型概述非点源污染模拟原理物质迁移内容过程营养物农药病原菌运移河道水质模型营养元素的地表水体循环河道水质模拟藻类模拟氮元素磷元素生化需氧量及溶解氧重金属的运移蓄水体水质模拟 引言 今天无意接触到这一块,就记录下来了。 模型概述 1、流域中非点源污染的来源主要是农业化肥和农药的施用。 2、氮、磷等营养物和农药的迁移和转化取决于化合物在土壤环境中经历的转化过程。 3、SWAT模型可以模拟水文相应单元内氮、磷完整的营养物循环过程和任何一种农药的降解过程。 4、SWAT模拟流域内泥沙、藻类、溶解氧、有机污染

DoWayChan的博客 4877

第54节:vue3+cesiumjs

对之前的vue2+cesiumjs 进行了升级

qq_29384639的博客 62

21 个 React 性能优化技巧

React 为高性能应用设计提供了许多优化方案,本文列举了其中的一些最佳实践。 在以下场景中,父组件和子组件通常会重新渲染: 在同一组件或父组件中调用 setState 时。 从父级收到的“props”的值发生变化。 调用组件中的 forceUpdate。 下面是提升 React 应用性能的 21 个技巧。 1. 使用纯组件 如果 React 组件为相同的状态和 props 渲染相同的输出,则可以将其视为纯组件。 对于像 this 的类组件来说,React 提供了 PureComponent 基类。扩展 R

weixin_43484007的博客 5693

财务数智化——解读224页 2025年数智技术业财融合应用蓝皮书【附全文阅读】

《数智技术赋能业财融合蓝皮书》面向企业管理者及数字化转型从业者,系统阐述数智技术在业财融合中的应用。全书围绕技术基础(定义、分类、发展趋势)、融合框架(三阶段路径与三层价值)、七大行业应用场景(涵盖核算自动化、智能收款、项目管控等)、关键技术(AI、大数据等)及实施要点(组织协同、数据治理等),通过典型案例为企业提供从技术到实践的全面指导,助力实现数据贯通与价值创造。

cdfunlove的博客 1745

ReactJS修炼之路(五):Immutable.js的使用及setState的一个误区

问题这篇博客仅作为学习笔记,没有多少自己的东西,只有一个小误区,记录下来当做备忘。学习资料: Immutable.js Immutable 详解及 React 中实践 关于Immutable.js如何整合进React中,推荐阅读官方的文档和上面第二篇博客,下面不会说具体的使用方法,所以阅读到这里这篇博客算是结束了。下面说说我以前在setState中踩的坑,同时也回答了一个问题,为什么需要Immuta

沉淀 6488

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

面试官:谈谈虚拟dom在Vue和React中的应用

作为国内应用最广的两个框架,Vue 和 React 是前端必须掌握的内容,也是面试的重点。但大多数读者都只擅长其中一个框架,当面试涉及到另一个框架的内容时,就答不好了。比如虚拟dom,两...

ITMuch的专栏 527

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Vue 在哪些方面比 React 做得更好?

“ Vue 太 low,只适合小项目,大项目扛不起来””React 无数个回调,无数个选择表达式,this绑定…乱!““Vue好上手,岗位多”“大厂基本都用 React,不用 Vue ”...

前端劝退师 623

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

面试官:Vue 和 React 的diff有什么不同

作为前端最火的两个框架,React 和 Vue 几乎是面试必考的内容。特别是到了中高级前端岗,企业不仅要考察你对两个框架的应用,还会从源码层面考察你对框架的掌握程度,比如:Computed...

weixin_46837985的博客 628

Vue 和 React 的diff有什么不同

作为前端广受欢迎的两个框架,React 和 Vue 几乎是面试必考的内容。特别是到了中高级前端岗,企业需要考察你对两个框架的应用,也会从源码层面考察你对框架的掌握程度,比如:Compute...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 559

Vue3.0 PK React17 ,谁胜?

“ Vue 太 low,只适合小项目,大项目扛不起来””React 无数个回调,无数个选择表达式,this绑定…乱!““Vue好上手,岗位多”“大厂基本都用 React,不用 Vue ”…...

祈澈菇凉 534

谈谈虚拟 dom 在 Vue 和 React 中的应用

作为国内应用最广的两个框架,Vue 和 React 是前端必须掌握的内容,也是面试的重点。但大多数读者都只擅长其中一个框架,当面试涉及到另一个框架的内容时,就答不好了。比如虚拟dom,两个...

全栈修炼 649

大厂面试官常问的React和Vue难题,都在这儿了!

作为国内应用最广的两个框架,Vue 和 React 是前端必须掌握的内容,也是面试的重点。但大多数读者都只擅长其中一个框架,当面试涉及到另一个框架的内容时,就答不好了。比如虚拟dom,两个...

web前端开发 865

深度对比学习Vue和React两大框架

作为国内应用最广的两个框架,Vue 和 React 是前端必须掌握的内容,也是面试的重点。但大多数读者都只擅长其中一个框架,当面试涉及到另一个框架的内容时,就答不好了。比如虚拟dom,两个...

u012384510的博客 541

Vue 和 React 大厂面试通关指南.pdf

作为国内应用最广的两个框架,Vue 和 React 是前端必须掌握的内容,也是面试的重点。但大多数读者都只擅长其中一个框架,当面试涉及到另一个框架的内容时,就答不好了。比如虚拟dom,两...

qq_34998786的博客 559

Vue 和 React源码学习指南,进阶必备(2)

我可以将最近整理的前端面试题分享出来,其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器、数据结构与算法等等,还在持续整理更新中,希望大家都能找到心仪的工作。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】6371)**

weixin_58134620的博客 945
上一篇: 动画学习之Animate.css的使用与解析
下一篇: D3.js SVG绘图实践:趋势缩略图
Sheldon_Law
博客等级 码龄11年 44粉丝 32原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值