仲灏小栈 仲灏小栈
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

仲灏

诚意, 正心, 格物, 致知
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《前端项目基础建设》
  • HTML&CSS

  • JavaScript&TypeScript

  • Node

  • 构建

  • Vue

  • React

    • Vue 放弃繁琐的render函数,拥抱JSX
    • Awesome React
    • React 文档(vue版)
    • react 项目开发注意事项
    • 常见功能实现
    • react 常见坑集合
    • ant design pro 学习
    • ProComponents设计思路
    • 万条数据渲染优化
    • react hook 与 闭包
    • JSX
    • React生命周期
    • React 基本使用 setState
    • React 基本使用 组件生命周期
    • React 高级使用 性能优化
      • React 高级使用 高阶组件
      • React Redux使用
      • react-router 使用
      • React 原理
      • React 面试题1
      • React 面试题2
      • React 面试题3
      • React 面试题5
      • 仿jira项目笔记 项目起航:项目初始化与配置
      • 第6章 CSS 其实很简单 - 用 CSS-in-JS 添加样式
      • 第8章 Hook,路由,与 URL 状态管理
      • pro-components 源码学习
      • ant-design Spin组件封装
      • React 生命周期
    • 小程序

    • 跨端

    • Electron

    • WebGL&GIS

    • 浏览器

    • 面经

    • 其他

    • 大前端
    • React
    仲灏
    2022-07-02
    目录

    React 高级使用 性能优化

    # shouldComponentUpdate ( 简称 SCU )

    # 基本用法

    shouldComponentUpdate(nextProps, nextState) {
      if (nextState.count !== this.state.count) {
        return true // 可以渲染
      }
      return false // 不重复渲染
    }
    
    1
    2
    3
    4
    5
    6

    React 默认: 父组件有更新,子组件无条件也更新

    SCU 在需要的时候才优化,不要为了开发而开发

    需要配合到 不可变值

    eg:

    onSubmit = (value) => {
      // right
      this.setState({
        list: this.state.list.concat({
          id: `id_${Date.now()}`,
          title: value
        })
      })
      
      // fail
      this.state.list.push({
        id: `id_${Date.now()}`,
        title: value
      })
      this.setState({
        list: this.state.list
      })
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    # 总结:

    • SCU 默认返回true ,即 React 默认重新渲染所有子组件
    • 必须配合 “ 不可变值 ” 一起使用
    • 可先不用 SCU, 有性能问题时再考虑

    # PureComponent 和 React.memo

    • PureCompnent , SCU 中实现了浅比较
    • memo, 函数组件中的 PureComponent
    • 浅比较已使用大部分情况 ( 尽量不要做深度比较)

    # PureComponent eg

    class List extends React.PureComponent {
      constructor(props) { ... }
      
      render() { ... }
      
      sholdComponentUpdate() { /*浅比较*/ }
    }
    
    1
    2
    3
    4
    5
    6
    7

    # memo eg

    function MyComponent (props) {
      /* 使用 props 渲染 */
    }
    function areEqual(prevProps, nextProps){
      /*
      如果把 nextProps 传入 render 方法的返回结果与
      将 prevProps 传入 render 方法的返回结果一致则返回 true,
      否则返回 false
      */
    }
    export default React.memo(MyComponent, areEqual);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    # 不可变值 immutable.js

    • 基于共享数据(不是深拷贝),速度好
    • 有一定的学习和迁移成本,按需使用

    e g:

    const map1 = Immutable.Map({ a: 1, b: 2, c: 3 })
    const map2 = map1.set({ 'b', 50 })
    map1.get('b')  // 2
    map2.get('b')  // 50
    
    1
    2
    3
    4
    #大前端#React#使用#高级使用
    上次更新: 2022/08/14, 18:25:44
    React 基本使用 组件生命周期
    React 高级使用 高阶组件

    ← React 基本使用 组件生命周期 React 高级使用 高阶组件→

    最近更新
    01
    vim日常使用记录
    04-02
    02
    滑动窗口最大值
    04-02
    03
    有效的字母异位词
    04-02
    更多文章>
    Theme by Vdoing | Copyright © 2021-2025 izhaong | github | 蜀ICP备2021031194号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式