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

React 性能优化的手段有哪些?

一、是什么

React凭借virtual DOMdiff算法拥有高效的性能,但是某些情况下,性能明显可以进一步提高

在前面文章中,我们了解到类组件通过调用setState方法, 就会导致render,父组件一旦发生render渲染,子组件一定也会执行render渲染

当我们想要更新一个子组件的时候,如下图绿色部分:

理想状态只调用该路径下的组件render

但是react的默认做法是调用所有组件的render,再对生成的虚拟DOM进行对比(黄色部分),如不变则不进行更新

从上图可见,黄色部分diff算法对比是明显的性能浪费的情况

二、如何做

在React中如何避免不必要的render (opens new window)中,我们了解到如何避免不必要的render来应付上面的问题,主要手段是通过shouldComponentUpdatePureComponentReact.memo,这三种形式这里就不再复述

除此之外, 常见性能优化常见的手段有如下:

  • 避免使用内联函数

  • 使用 React Fragments 避免额外标记

  • 使用 Immutable

  • 懒加载组件

  • 事件绑定方式

  • 服务端渲染

#避免使用内联函数

如果我们使用内联函数,则每次调用render函数时都会创建一个新的函数实例,如下:

import React from "react";export default class InlineFunctionComponent extends React.Component {render() {return (<div><h1>Welcome Guest</h1><input type="button" onClick={(e) => { this.setState({inputValue: e.target.value}) }} value="Click For Inline Function" /></div>)}
}

我们应该在组件内部创建一个函数,并将事件绑定到该函数本身。这样每次调用 render 时就不会创建单独的函数实例,如下:

import React from "react";export default class InlineFunctionComponent extends React.Component {setNewStateData = (event) => {this.setState({inputValue: e.target.value})}render() {return (<div><h1>Welcome Guest</h1><input type="button" onClick={this.setNewStateData} value="Click For Inline Function" /></div>)}
}

使用 React Fragments 避免额外标记

用户创建新组件时,每个组件应具有单个父标签。父级不能有两个标签,所以顶部要有一个公共标签,所以我们经常在组件顶部添加额外标签div

这个额外标签除了充当父标签之外,并没有其他作用,这时候则可以使用fragement

其不会向组件引入任何额外标记,但它可以作为父级标签的作用,如下所示:

export default class NestedRoutingComponent extends React.Component {render() {return (<><h1>This is the Header Component</h1><h2>Welcome To Demo Page</h2></>)}
}

 

事件绑定方式

在事件绑定方式 (opens new window)中,我们了解到四种事假绑定的方式

从性能方面考虑,在render方法中使用bindrender方法中使用箭头函数这两种形式在每次组件render的时候都会生成新的方法实例,性能欠缺

constructorbind事件与定义阶段使用箭头函数绑定这两种形式只会生成一个方法实例,性能方面会有所改善

#使用 Immutable

在理解Immutable中 (opens new window),我们了解到使用 Immutable可以给 React 应用带来性能的优化,主要体现在减少渲染的次数

在做react性能优化的时候,为了避免重复渲染,我们会在shouldComponentUpdate()中做对比,当返回true执行render方法

Immutable通过is方法则可以完成对比,而无需像一样通过深度比较的方式比较

#懒加载组件

从工程方面考虑,webpack存在代码拆分能力,可以为应用创建多个包,并在运行时动态加载,减少初始包的大小

而在react中使用到了Suspense和 lazy组件实现代码拆分功能,基本使用如下:

const johanComponent = React.lazy(() => import(/* webpackChunkName: "johanComponent" */ './myAwesome.component'));export const johanAsyncComponent = props => (<React.Suspense fallback={<Spinner />}><johanComponent {...props} /></React.Suspense>
);

服务端渲染

采用服务端渲染端方式,可以使用户更快的看到渲染完成的页面

服务端渲染,需要起一个node服务,可以使用expresskoa等,调用reactrenderToString方法,将根组件渲染成字符串,再输出到响应中

例如:

import { renderToString } from "react-dom/server";
import MyPage from "./MyPage";
app.get("/", (req, res) => {res.write("<!DOCTYPE html><html><head><title>My Page</title></head><body>");res.write("<div id='content'>");  res.write(renderToString(<MyPage/>));res.write("</div></body></html>");res.end();
});

客户端使用render方法来生成HTML

import ReactDOM from 'react-dom';
import MyPage from "./MyPage";
ReactDOM.render(<MyPage />, document.getElementById('app'));

其他

除此之外,还存在的优化手段有组件拆分、合理使用hooks等性能优化手段...

http://www.jsqmd.com/news/688514/

相关文章:

  • 曹操出行难做Robotaxi版“滴滴”
  • Windows下Python venv报错exit status 1?别急着删文件夹,试试这个--without-pip参数
  • 为什么需要专业的冷气机、工业制冷机与液冷测试机?2026年冷气机/工业制冷机/液冷测试机精选推荐公司 - 品牌推荐大师1
  • 核心零部件难在哪儿?盈诺、日立、佳航三家DSC的传感器灵敏度与热流噪声数据公开 - 品牌推荐大师1
  • 昆明诚誉名酒回收:昆明上门酒回收哪个公司好 - LYL仔仔
  • 数据防泄漏软件怎么选?26最新整理六款数据防泄漏软件,建议收藏
  • 国内翘嘴鱼水饺供应商实力TOP5 技术与品质双对标 - 资讯焦点
  • #广州最推荐的外语学校有哪些?2026年增城等地市场选择前五排名 - 十大品牌榜
  • 联想刃7000K BIOS隐藏选项解锁指南:3步开启高级性能设置
  • Phi-3.5-mini-instruct开源可部署:ModelScope镜像+GitHub源码双通道
  • 2026年贵州手提袋定制与包装辅料设计的专业选择指南 - 优质企业观察收录
  • 2026年冷气机/工业制冷机/液冷测试机厂家企业供应商对比推荐 - 品牌推荐大师1
  • 烟威不锈钢加工性价比深度实测:多维数据硬核排行与采购避坑指南 - 资讯焦点
  • 防火墙双机热备之VGMP故障切换机制深度剖析
  • 海口家长必看!发育迟缓干预机构全解析 - 品牌测评鉴赏家
  • 身份证阅读器除了读信息还能干啥?新中新SDK隐藏功能与M1卡操作指南
  • #宁夏最推荐的高处作业培训学校有哪些?2026年银川吴忠石嘴山等地市场选择前十排名 - 十大品牌榜
  • 龙鱼用品什么牌子好?马印为何成为高端玩家首选 - 观域传媒
  • 从语法到实战:COE文件在FPGA设计中的核心应用与自动化生成
  • 烟台全屋定制实测5 大主流品牌深度对比与选型指南 - 资讯焦点
  • 掌握15MW海上风电仿真:IEA-15-240-RWT完整实战指南
  • 如何用TaskbarX打造专业级Windows任务栏:终极配置完全指南
  • 2026年螺杆式冷水机/工业冷水机厂家企业供应商对比推荐 - 品牌推荐大师1
  • IK Rig编辑器
  • 别再让手机烫手了!实测Skype、微信、FaceTime哪个才是iPhone煲电话粥的省电神器
  • vscode ctrl+c失效
  • 春天脸黄到不敢素颜?常天然精华真实测评:干燥暗沉肌的春季救星,黄气散了 - 资讯焦点
  • 云南丽江旅行婚礼TOP推荐排行榜:2026高端定制品牌最新测评 - 深度智识库
  • 终极PL2303驱动解决方案:让老旧串口设备在Windows 10/11重获新生 [特殊字符]
  • Allegro约束规则保姆级配置指南:从DEFAULT到差分对,手把手教你设置PCS/SCS/ECS