这里主要分析在函数式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进行世俗据处理计算

使用useMemousecallback分别对变量回调函数进行一个包裹处理

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优化的更多相关文章

  1. react优化--pureComponent

    shouldComponentUpdate的默认渲染 在React Component的生命周期中,shouldComponentUpdate方法,默认返回true,也就意味着就算没有改变props或 ...

  2. React 组件性能优化

    React组件性能优化 前言 众所周知,浏览器的重绘和重排版(reflows & repaints)(DOM操作都会引起)才是导致网页性能问题的关键.而React虚拟DOM的目的就是为了减少浏 ...

  3. 你所要掌握的最简单基础的React渲染优化

    一.React的渲染机制 要掌握一两项React-render优化的方法不难,但是非常重要.无论是在实际项目中的一个小细节,还是迎合'面试官'的口味 1.1 触发Render 我们知道React要更新 ...

  4. 如何对 React 函数式组件进行优化

    文章首发个人博客 前言 目的 本文只介绍函数式组件特有的性能优化方式,类组件和函数式组件都有的不介绍,比如 key 的使用.另外本文不详细的介绍 API 的使用,后面也许会写,其实想用好 hooks ...

  5. React拖拽组件Dragact V0.1.7:教你优化React组件性能与手感

    仓库地址:Dragact手感丝滑的拖拽布局组件 预览地址:支持手机端噢- 上回我们说到,Dragact组件已经进行了一系列的性能优化,然而面对大量数据的时候,依旧比较吃力,让我们来看看,优化之前的Dr ...

  6. React函数式组件的性能优化

    优化思路 主要优化的方向有2个: 减少重新 render 的次数.因为在 React 里最重(花时间最长)的一块就是 reconction(简单的可以理解为 diff),如果不 render,就不会 ...

  7. 必须要会的 50 个 React 面试题

    翻译:疯狂的技术宅 原文:www.edureka.co/blog/interv… 如果你是一位有抱负的前端程序员并准备面试,那么这篇文章很适合你.本文是你学习和面试 React 所需知识的完美指南. ...

  8. React 学习(五) ---- 条件和列表渲染

    条件渲染 React中的条件渲染和我们平常写的js 代码一样,都是用的if else, 只不过在if else 中它的返回值是jsx, 根据不同的条件渲染不同的UI. 先写两个组件 //登录的用户显示 ...

  9. [Web 前端] mobx教程(三)-在React中使用Mobx

    copy from : https://blog.csdn.net/smk108/article/details/85053903 Mobx提供了一个mobx-react包帮助开发者方便地在React ...

随机推荐

  1. Spring Cloud系列(五):服务网关Zuul

    在前面的篇章都是一个服务消费者去调用一个服务提供者,但事实上我们的系统基本不会那么简单,如果真的是那么简单的业务架构我们也没必要用Spring Cloud,直接部署一个Spring Boot应用就够了 ...

  2. 「题解」NWRRC2017 Grand Test

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P7025.gym101612G. 题意概述 给你一张有 \(n\) 个点 \(m\) 条边的无向图,无重边无自环, ...

  3. python学习笔记03-变量和字符串

    变量 变量:把一个值赋值给一个名字时,它会储存在内存中,称之为变量(virable):但在python中并不会储存在变量里,仅仅是类似于给值加了标签 变量的使用规则: 1.使用变量,首先需要给变量赋值 ...

  4. Django基础之模型层(01)

    内容概要 查询关键字 MySQL select    from    where    group by    having    order by    distinct    limit    r ...

  5. 入门实践丨如何在K3s上部署Web应用程序

    在本文中,我们将使用Flask和JavaScript编写的.带有MongoDB数据库的TODO应用程序,并学习如何将其部署到Kubernetes上.这篇文章是针对初学者的,如果你之前没有深度接触过Ku ...

  6. centos7安装JDK、CentOS

    1.安装JDK 1.1查看系统是否已有自带的JDK rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 1.2卸载已有安装 如果没有输出信息, ...

  7. Docker与k8s的恩怨情仇(三)—后浪Docker来势汹汹

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一节我们为大家介绍了Cloud Foundry等最初的PaaS平台如何解决容器问题,本文将为大家展示Doc ...

  8. 理解vertical-align

    vertical-align 支持的属性值及组成 inherit 线类baseline, top, middle, bottom 文本类text-top, text-bottom 上标下标类sub, ...

  9. Mysql的5种索引添加类型

    1.添加普通索引: alter table 'table_name' add index index_name('column') 2.添加主键索引 alter table 'table_name' ...

  10. flex发生错误积累。每次遇到错误记录一点点

    error #2044: 未处理的 ioerrorevent: text=error #2036: 加载未完成 出现这个问题,因为我是要实现图片编辑裁剪,然后上传.没有上传成功,出现上面的这个错误, ...