从 setState 聊到 React 性能优化

706次阅读  |  发布于3年以前

setState的同步和异步

1.为什么使用setState

2.setState异步更新

setState是异步更新的

3.如何获取异步的结果

3.setState一定是异步的吗?

  • 其实可以分成两种情况
  • 在组件生命周期或React合成事件中, setState是异步的
  • setTimeou或原生DOM事件中, setState是同步的

4.源码分析

setState的合并

1.数据的合并

2.多个state的合并

React 更新机制

1.React 更新机制

2.React 更新流程

情况一: 对比不同类型的元素

情况二: 对比同一类型的元素

情况三: 对子节点进行递归

React 性能优化

1.key的优化

key的注意事项:

  • key应该是唯一的
  • key不要使用随机数(随机数在下一次render时,会重新生成一个数字)
  • 使用index作为key,对性能是没有优化的

2.render函数被调用

3.shouldComponentUpdate

React给我们提供了一个生命周期方法 shouldComponentUpdate(很多时候,我们简称为SCU),这个方法接受参数,并且需要有返回值;主要作用是:**控制当前类组件对象是否调用render**方法

// 决定当前类组件对象是否调用render方法
// 参数一: 最新的props
// 参数二: 最新的state
shouldComponentUpdate(nextProps, nextState) {
  // 默认是: return true
  // 不需要在页面上渲染则不调用render函数
  return false
}

4.PureComponent

5.shallowEqual方法

这个方法中,调用 !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState),这个 shallowEqual 就是进行浅层比较:

6.高阶组件memo

import React, { PureComponent, memo } from 'react'

// MemoHeader: 没有依赖props,不会被重新调用render渲染
const MemoHeader = memo(function Header() {
  console.log('Header被调用')
  return <h2>我是Header组件</h2>
})

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8