React优化
这里主要分析在函数式react中的优化,类组件有生命周期函数定义较明确
React的核心特征之一是单向数据流(props自上往下流)
这会导致一个问题:当父组件state更新后,其自身及其所有children(不论是否接收props)都会进行更新,但向下传递的props部分并未发生改变,我们应当让这部分children不用重新渲染
在类组件中可以使用 componentShouldUpdate 控制是否更新
为什么可以通过数据变化判断是否更改?(React函数式组件是纯函数,不会修改props(包含数据、函数),只能被动地根据props渲染。只要props不变,其渲染结果是可预测的)
一个组件需要重新渲染,有如下3种情况:
该组件自己的状态state改变
父组件重新渲染,导致子组件重新渲染,但是父组件传递的 props未改变
父组件重新渲染,导致子组件重新渲染,但是父组件传递的 props 改变
情况1必须重新渲染,情况2不必,情况3需要
//目录结构
..App.js
....pages
......TestOne.js
......TestTwo.js
// TestOne组件
export const TestOne = (props)=>{
console.log('渲染testone')
return (
<div>
testOne
</div>
)
}
// TestTwo组件
export const TestTwo = (props)=>{
console.log('渲染testone');
return (
<div>
TestTwo
</div>
)
}
// index.js
export {TestOne} from './testOne'
export {TestTwo} from './TestTwo'
//APP.js
import {TestTwo , TestOne} from './pages/index'
const App = () => {
const [num , setNum] = useState(0)
console.log('渲染');
return (
<div className="App">
<TestOne></TestOne>
<TestTwo></TestTwo>
<div onClick={()=>{setNum(num+1)}}>数据展示:<span>{num}</span></div>
</div>
);
}
性能优化有2个方面:
1、减少不必要的渲染
2、减少不必要的计算量
针对第1项:
使用React.memo包裹暴露的子组件
// TestTwo.js
export const TestTwo = React.memo(Fn,[compareFn(oldV,newV)])
// React.memo默认只会作第一层的props是否相同,props引用本身
针对第2项:
子组件可能会基于props进行世俗据处理计算
使用useMemo、usecallback分别对变量、回调函数进行一个包裹处理
import {useMemo , useCallback} from 'react'
const App = () => {
const [num , setNum] = useState(0)
console.log('渲染');
const Callback = useCallback(()=>{
return setNum
},[setNum])
const numMemo = useMemo(()=>{
return num
},[num])
return (
<div className="App">
<TestOne></TestOne>
<TestTwo></TestTwo>
<div onClick={()=>{setNum(num+1)}}>数据展示:<span>{num}</span></div>
</div>
);
}
React优化的更多相关文章
- react优化--pureComponent
shouldComponentUpdate的默认渲染 在React Component的生命周期中,shouldComponentUpdate方法,默认返回true,也就意味着就算没有改变props或 ...
- React 组件性能优化
React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...
- 你所要掌握的最简单基础的React渲染优化
一.React的渲染机制 要掌握一两项React-render优化的方法不难,但是非常重要.无论是在实际项目中的一个小细节,还是迎合'面试官'的口味 1.1 触发Render 我们知道React要更新 ...
- 如何对 React 函数式组件进行优化
文章首发个人博客 前言 目的 本文只介绍函数式组件特有的性能优化方式,类组件和函数式组件都有的不介绍,比如 key 的使用.另外本文不详细的介绍 API 的使用,后面也许会写,其实想用好 hooks ...
- React拖拽组件Dragact V0.1.7:教你优化React组件性能与手感
仓库地址:Dragact手感丝滑的拖拽布局组件 预览地址:支持手机端噢- 上回我们说到,Dragact组件已经进行了一系列的性能优化,然而面对大量数据的时候,依旧比较吃力,让我们来看看,优化之前的Dr ...
- React函数式组件的性能优化
优化思路 主要优化的方向有2个: 减少重新 render 的次数.因为在 React 里最重(花时间最长)的一块就是 reconction(简单的可以理解为 diff),如果不 render,就不会 ...
- 必须要会的 50 个 React 面试题
翻译:疯狂的技术宅 原文:www.edureka.co/blog/interv… 如果你是一位有抱负的前端程序员并准备面试,那么这篇文章很适合你.本文是你学习和面试 React 所需知识的完美指南. ...
- React 学习(五) ---- 条件和列表渲染
条件渲染 React中的条件渲染和我们平常写的js 代码一样,都是用的if else, 只不过在if else 中它的返回值是jsx, 根据不同的条件渲染不同的UI. 先写两个组件 //登录的用户显示 ...
- [Web 前端] mobx教程(三)-在React中使用Mobx
copy from : https://blog.csdn.net/smk108/article/details/85053903 Mobx提供了一个mobx-react包帮助开发者方便地在React ...
随机推荐
- Java期末考试编程题复习
在程序中定义Person类,为该类编写如下字段.构造器.访问器.修改器和相应的其他方法.(20分) <1>在Person类中定义两个字段: 私有访问权限,类型为String的name字段: ...
- TOP-5错误率
TOP-5错误率是指每幅图像同时用5个类别标签进行预测:如果其中任何一次预测正确,就认为预测正确,如果5次预测的结果都错了,才认为预测错误,这时的分类错误率就是TOP-5错误率.
- You Only Look One-level Feature
你只需要看一个层次的特征 摘要:本文回顾了单阶段检测器的特征金字塔网络(FPN),指出FPN的成功在于其对目标检测优化问题的分治解决,而不是多尺度特征融合.从优化的角度来看,我们引入了一种替代的方法来 ...
- LuatOS | 全新在线模拟器,随时随地发挥创意
LuatOS --运行在嵌入式硬件的实时操作系统,开启全新物联网生态. 聚焦嵌入式应用生态,内置功能可支持绝大多数物联网应用场景.深度整合Lua语言,只需少量内存和Flash空间就能运行.不局限于合宙 ...
- DG duplicate报错:RMAN-05001:auxiliary file name /u01/app/oracle/oradata/fratbs01.dbf conflicts with a file used by the target database
问题:rman duplicate时报错: RMAN-05001:auxiliary file name /u01/app/oracle/oradata/fratbs01.dbf conflicts ...
- DOS命令行(8)——netsh-网络配置命令行工具
netsh 介绍与语法 netsh(Network Shell) 是一个windows系统本身提供的功能强大的网络配置命令行工具,可用来显示与修改当前正在运行的计算机的网络配置(如:IP地址.网关.D ...
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- [心得体会]jvm
1. jvm基本架构图 橙色: 线程共享的, gc主要的场所 灰色: 线程不共享 2. 类加载器 启动类加载器(c++加载器) 扩展类加载器(java应用程序加载器) 应用加载器(加载classpat ...
- 官宣.NET 6 预览版4
我们很高兴发布 .NET 6 Preview 4.我们现在大约完成了 .NET 6 发布的一半.现在是一个很好的时机,可以再次查看.NET6的完整范围.许多功能都接近最终形式,而其他功能将很快推出,因 ...
- Leetcode No.27 Remove Element(c++实现)
1. 题目 1.1 英文题目 Given an integer array nums and an integer val, remove all occurrences of val in nums ...