react的优化方法

2023-11-06

目录

1.render里面尽量减少新建变量和bind函数,传递参数是尽量减少传递参数的数量。

2.定制shouldComponentUpdate函数

3.使用React.PureComponent

4.使用React.memo来缓存组件

5.延迟加载不是立即需要的组件

React.loadable

React.Lazy/React.Suspense 

 6.调整CSS而不是强制组件加载和卸载

 7.使用React.Fragment避免添加额外的DOM


1.render里面尽量减少新建变量和bind函数,传递参数是尽量减少传递参数的数量。

第一种是在构造函数中绑定this,构造函数每次渲染只会执行一遍;

第二种是在render()函数里绑定this,每次render()都会重新执行一遍函数;

第三种使用箭头函数,每次render()都会生成一个新的箭头函数

react判断是否需要进行render是浅层比较

2.定制shouldComponentUpdate函数

3.使用React.PureComponent

React.PureComponent 与 React.Component 很相似。两者的区别在于 React.Component 并未实现 shouldComponentUpdate(),而 React.PureComponent 中以浅层对比 prop 和 state 的方式来实现了该函数。

React.PureComponent 中的 shouldComponentUpdate() 将跳过所有子组件树的 prop 更新。因此,请确保所有子组件也都是“纯”的组件。

使用PureComponent的一个前提:组件在相同 props 传入值的情况下总会有相同的渲染内容。(类似纯函数的定义:传入相同的参数执行后,总会得到相同的返回值)

从另一个方面来说,就是 PureComponent 跳过渲染时,它的所有子组件也会跳过渲染,即使子组件应被更新,所以需要保证纯组件的所有子组件也都是纯组件。

class App extends React.Component {
	constructor(props) {
		super(props);
		this.state = {
			date: new Date(),
		};
	}
	componentDidMount() {
		setInterval(() => {
			this.setState({
				date: new Date(),
			});
		}, 1000);
	}
	render() {
		return (
			<div>
				<div>{this.state.date.toString()}</div>
				<B seconds={1} />
			</div>
		);
	}
}

class B extends React.PureComponent {
	render() {
		console.log('B is rendering');
		return <div>I am update every {this.props.seconds.t} seconds</div>;
	}
}

4.使用React.memo来缓存组件

React.memo是一个高阶组件,高阶组件(HOC)是参数为组件,返回值为新组件的函数

React.memo 仅检查 props 变更。如果函数组件被 React.memo 包裹,且其实现中拥有 useState,useReducer 或 useContext 的 Hook,当 state 或 context 发生变化时,它仍会重新渲染。默认情况下其只会对复杂对象做浅层对比,如果你想要控制对比过程,那么请将自定义的比较函数通过第二个参数传入来实现

const C = React.memo((props) => {
    console.log("C is rending")
    return <div>I am update every {props.seconds} seconds</div>
})

5.延迟加载不是立即需要的组件

React.loadable

参考https://blog.csdn.net/my_new_way/article/details/106987751

React-loadable支持React的服务端渲染

React.Lazy/React.Suspense 

 React.lazy和Suspense并不支持服务端渲染

// App.js
import './App.css';
import React from 'react';
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
import Loadable from 'react-loadable';

function MyLoadingComponent({ error }) {
	if (error) {
		return <div>Error!</div>;
	} else {
		return <div>Loading...</div>;
	}
}

// react-loadable
const LoadableComponent = Loadable({
	loader: () => import('./pages/home'),
	loading: MyLoadingComponent,
});

// React.lazy/React.suspanse
const About = React.lazy(() => import('./pages/about'));

function MyComponent() {
	return (
		// 显示 <MyLoadingComponent> 组件直至 About 加载完成
		<React.Suspense fallback={<MyLoadingComponent />}>
			<div>
				<About />
			</div>
		</React.Suspense>
	);
}
class App extends React.Component {
	render() {
		return (
			<BrowserRouter>
				<Routes>
					<Route path='/home' element={<LoadableComponent />} />
					<Route path='/about' element={<MyComponent />} />
				</Routes>
				<div>
					<Link to='/home'>Home</Link>
					<br />
					<Link to='/about'>About</Link>
				</div>
			</BrowserRouter>
		);
	}
}
// Home.jsx
import React, { Component } from 'react';

export default class Home extends Component {
	render() {
		console.log('render home component');
		return <div>home</div>;
	}
}
import React, { Component } from 'react';

export default class About extends Component {
	render() {
		console.log('render about component');
		return <div>about</div>;
	}
}

 6.调整CSS而不是强制组件加载和卸载

将不透明度调整为0对浏览器的成本消耗几乎为0(因为它不会导致重排),并且应尽可能优先于更该visibility 和 display 

// 避免对大型的组件频繁加载和卸载
function Component(props) {
  const [view, setView] = useState('view1');
  return view === 'view1' ? <SomeComponent /> : <AnotherComponent />  
}

// 使用该方式提升性能和速度
const visibleStyles = { opacity: 1 };
const hiddenStyles = { opacity: 0 };
function Component(props) {
  const [view, setView] = useState('view1');
  return (
    <React.Fragment>
      <SomeComponent style={view === 'view1' ? visibleStyles : hiddenStyles}>
      <AnotherComponent style={view !== 'view1' ? visibleStyles : hiddenStyles}>
    </React.Fragment>
  )
}

 7.使用React.Fragment避免添加额外的DOM

    有些情况下,我们需要在组件中返回多个元素,但是在react规定组件中必须有一个父元素,我们就会在多个元素外套一个div父元素。实际上页面上的元素越多,加载所需的时间就越多。为了减少不必要的加载时间,我们可以使React.Fragment来避免创建不必要的元素。

function Component() {
        return (
            <React.Fragment>
                <h1>Hello world!</h1>
                <h1>Hello there!</h1>
                <h1>Hello there again!</h1>
            </React.Fragment>
        )
}

参考文档:React性能优化的8种方式 - 江湖之下 - 博客园

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react的优化方法 的相关文章

  • React.js this.props.data.map() 不是一个函数

    我正在搞乱反应并尝试解析和渲染 json 对象 现在 我只是使用硬编码对象设置它以进行测试 而不是从 ajax 调用中获取它
  • Phonegap应用程序与reactjs [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有人用reactjs 通过facebook 编写了phonegap应用程序吗 任何指向参考实现的指针将不胜感激 此外 您建议将什么数据
  • 理解react-hooks/exhaustive-deps useEffect和调度事件

    我有这个警告 React Hook useEffect has a missing dependency dispatch Either include it or remove the dependency array react hoo
  • react-dom/server 可以在客户端工作吗?

    我需要在客户端呈现顶级 html 标签 例如 结果将被注入到 iframe 中 在服务器上 我会使用renderToStaticMarkup函数来自react dom server 但仅限客户端react dom没有这个功能 Will re
  • 需要将焦点放在react中的div上

    我有一个之前用 H1 标签包裹的文本 页面加载后 我需要专注于该文本 为了方便起见 我将它包装在 div 中 render const translate billing primaryContactSelection true this
  • 由于 useEffect 重新渲染而导致图表重复

    我有一个父组件 我用它来传递道具 即backgroundColor 到子组件
  • 下一个验证 |当用户对象有太多项目时,会话请求没有数据

    我会尽力为我解释我的问题 我使用 Strapi 作为后端 使用 Nextjs 作为前端 对于身份验证 我使用 NextAuth nextauth js const options providers Providers Credential
  • getFieldValue 或 Formik 中的类似内容

    有没有办法获取 formik 中单击处理程序内字段的值 您可以使用setFieldValue在那里 所以我假设 但在任何地方都找不到 Formik 应该有类似的东西来检索值
  • Material UI 的自定义 ESLint 导入规则

    我在 React 中有一个项目 使用 Material UI 我正在应用其中之一他们建议的方法 https material ui com guides minimizing bundle size option 2减少我的包大小 基本上
  • 如何检查令牌过期和注销用户?

    当用户单击注销按钮时 他 她可以自己注销 但是如果令牌过期 他 她就无法注销 因为在我的应用程序中 令牌在服务器端和前端都使用 当用户单击注销按钮时 如果令牌有效 则服务器和浏览器中的令牌都会被清除 当用户未注销并且他 她的令牌过期但未在浏
  • 如何实现rtk的createApi查询去抖

    有人可以帮助我使用 creatApi 和 redux 工具包中的查询实现来实现去抖功能 提前致谢 我个人在 RTK 查询中没有发现任何开箱即用的去抖动实现 但你可以自己实现 定义一个api 我正在使用 openlibrary 的一个 imp
  • 在reactjs中停止超时?

    有没有办法可以杀死 摆脱 reactjs 中的超时 setTimeout function do something bind this 3000 通过某种点击或操作 我希望能够完全停止并结束超时 有没有办法做到这一点 谢谢 假设这种情况发
  • 地图内的三元运算符

    我正在开发一个网络应用程序 用户可以在其中查看项目列表 并可以将某些项目标记为收藏夹 收藏夹以带有 prop this props favourites 的 ID 数组的形式提供 为了防止重复条目 如果 item id 已经在 this p
  • 无法在 ReactJS 中渲染嵌套地图

    我正在尝试嵌套地图以在对象内渲染数组 我的卡片组件渲染方法 非嵌套 工作 render return div class mediator container this state routeList map route index gt
  • React 和 Leaflet 结合的好方法

    我正在开发一个将 React 和 Leaflet 结合起来的项目 但我必须说我在语义方面遇到了一些困难 由于大部分内容都是由 Leaflet 直接管理的 我不知道将 Leaflet 映射实例添加为 React 组件中的状态是否有意义 当涉及
  • 如何在 eclipse 中将 ReactJs 与 Spring MVC 集成

    我是新来的ReactJS 在我使用之前angularJS对于我的客户端 但现在我想将它与当前的应用程序集成SpringMVC 现在我想整合ReactJS作为客户端而不是angularJS 请帮我 如果有任何例子请帮忙 我在用eclipse
  • React-Spring useTransition 随机排列我的列表项

    我有一个使用 React Spring 过渡呈现的标签列表 这个想法是 您可以添加项目 如果超过 5 个 则会出现 显示更多 按钮 按此按钮可以切换是显示所有标签还是仅显示前五个标签 问题是当我从 显示更多 转变为 显示更少 时 我注意到
  • Redux中如何处理关系数据?

    我正在创建的应用程序有很多实体和关系 数据库是关系型的 为了获得一个想法 有超过 25 个实体 它们之间具有任何类型的关系 一对多 多对多 该应用程序基于 React Redux 为了从商店获取数据 我们使用Reselect https g
  • 使用 React Router v6 保护路由 [重复]

    这个问题在这里已经有答案了 使用新版本 6 的 React router 编写 ProtectedRoute 的正确方法是什么 我写了这个 但这不是一条路线 const PrivateRoute component Component pr
  • 如何使用 React-router-component 从 ajax 调用成功后重定向?

    我正在使用构建一个应用程序Facebook flux的架构React JS 我已经构建了应用程序的基本部分 其中有一个登录表单 我正在从节点服务器获取结果以验证商店的用户 我正在从服务器获取结果 现在我陷入困境 如何在成功后将用户重定向到主

随机推荐

  • CAP迷思:关于分区容忍性

    点击上方 分布式实验室 关注公众号 回复 1 抽取技术书 CAP理论是分布式存储系统的热门话题 然而 它被大量误用了 在本文中 我想强调为什么通常的说法 一致性 C 可用性 A 和分区容忍性 P 只能选择两个 对分布式系统来说 是不适当的
  • 结冰过程渲染-Ovito实现

    关注 M r m a t e r
  • Python 自动化测试实战

    一 Python实现HTTP接口测试 1 接口测试概述 1 接口测试简介 首先谈谈接口测试 接口测试和日常的人工测试不同 它往往不是一个对完整功能的测试 而是对某个服务的函数或者对外暴露的访问接口进行测试 测试的目的是检测该接口是否稳定可靠
  • python 版本错误导致的 roscore 问题

    这几天快疯了 ROS好多坑 提醒一下python的版本不要随意切换哈 我的python 从自带的python 2 7变成 python 3 6后出现很多的问题 其中一个就是 roscore问题 问题如下 Traceback most rec
  • 解决Error starting ApplicationContext.To display the conditions report re-run your application xxx的问题

    目录 1 配置文件的错误 2 编译的错误 3 定义请求接口重复的错误 4 没加 Mapper注解的错误 5 端口重复错误 6 包冲突的错误 7 总结 解决Error starting ApplicationContext To displa
  • mongod连接数据库被拒绝

    这周想着写一下实训项目 但是连接数据库的时候无论如何都连接不上 问题是单独写了一个连接文件运行时是可以连接上的 但是在那个项目里边一直显示连接被拒绝 const mongoose require mongoose 链接数据库 mongoos
  • 计算机网络--谢希仁--重要知识点整理

    由于我近期在复习计算机网络的时候无意间在网上发现了一个比较不错的文章 这位大佬归纳得很详细 所以我在这边转载一下分享给大家 文章作者 烟雨迷离半世殇 文章链接 计算机网络重点知识整理 烟雨迷离半世殇的成长之路 雄关漫道真如铁 而今迈步从头越
  • python Hill密码

    以下python代码用于生成Hill密码的密钥矩阵及其逆矩阵 PydevCodeAnalysisIgnore input N output a pair of matrix which is inverse matrix of anothe
  • epoll基本原理及使用框架

    epoll基本原理及使用框架 epoll是Linux下多路复用IO接口select poll的增强版本 它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率 因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之
  • 从零玩转系列之微信支付实战PC端接口搭建

    一 前言 halo各位大佬很久没更新了最近在搞微信支付 因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联 至此微信支付Native支付完成 此篇文章过长我将分几个阶段的文章发布 项目源码都有 小程序和PC端 在此之前
  • 毕业设计-基于机器视觉的回转体零件表面缺陷检测研究-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 回转体零件的图像预处理 二 图像分割 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要
  • elementUI中el-tabs组件接口多次请求解决方案

    首先看代码
  • 软件测试学习路线-基础篇

    目录 功能测试 自动化测试Selenium和Appium 接口测试Jmeter 性能测试Loadrunner 软件测试自学实践部分比较难 因为需要找到有问题的源代码进行测试 更建议跟团队一起学习 下面讲讲软件测试的学习路线 希望对你有所帮助
  • Go项目配置管理工具---Viper

    目录 Viper概述 前言 功能 viper配置优先级 从Viper中获取值 读取配置文件 注册和使用别名 把值写入Viper 设置默认值 使用Set方法设置值 把配置信息写入配置文件 从io Reader中读取配置信息到viper 监控V
  • JetBrains注解@NotNull/@Nullable/@Contract

    JetBrains 的注解库 然后通过在 IDE 里面提示你处理那些可能为 null 的值 编译器没法检查并提示 避免NullPointerException 对于空指针异常 Java 只有 IDE 警告 正式名称叫 inferred an
  • 性能测试用什么工具?3分钟了解自动化测试工具Parasoft和LoadRunner的功能对比

    本文是自动化测试工具Parasoft功能对比之SOAtest测试篇之一 将介绍Parasoft SOATest和同类工具LoadRunner的功能对比 哪一款更强大一目了然 如果你想试用Parasoft的强大功能 可以申请Parasoft测
  • Could not connect to SMTP host: smtp.163.com, port: 25;阿里云 ECS

    ECS基于安全考虑 目前已禁用25端口 如果您的发送程序部署在阿里云ECS上 建议您不勾选SSL时 使用80端口 勾选SSL时 使用465端口 测试端口 telnet smtp 163 com 25 测试网络 ping smtp 163 c
  • Python由用户输入学生学号与姓名,数据用字典存储,最终输出学生信息(按学号由小到大显示)

    Python字典存储学生信息 且排序 由用户输入学生学号与姓名 数据用字典存储 最终输出学生信息 按学号由小到大显示 students while 1 student input 请输入学号 输入q停止输入信息 if student q b
  • 雷电模拟器谷歌套件安装的时候总是卡着转圈圈

    雷电模拟器安装谷歌套件 安装的时候总是卡着转圈圈 尝试开启网卡桥接 不过依然不行 最后各种把电脑的网络折腾切换 依然不行 开始的想法是觉得虚拟机的网络应该是串用电脑网络的 可是最后发现这样并不行 虚拟机并不能直接使用宿主机的网络环境 最后想
  • react的优化方法

    目录 1 render里面尽量减少新建变量和bind函数 传递参数是尽量减少传递参数的数量 2 定制shouldComponentUpdate函数 3 使用React PureComponent 4 使用React memo来缓存组件 5