【前端知识】React 基础巩固(二十三)——React 性能优化 SCU相关

这篇具有很好参考价值的文章主要介绍了【前端知识】React 基础巩固(二十三)——React 性能优化 SCU相关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

React 基础巩固(二十三)——React 性能优化 SCU

React 更新机制

  • React 的渲染流程

    • JSX -> 虚拟 DOM -> 真实 DOM
  • React 的更新流程

    • props/state 改变 -> render函数重新执行 -> 产生新的DOM树 -> 新旧DOM树进行diff -> 计算出差异进行更新 -> 更新到真实的DOM
  • React 在 props 或 state 发生改变时,会调用 React 的 render 方法,会创建一颗不同的树

  • React 需要基于这两颗不同的树之间的差别来判断如何有效的更新 UI

    • 如果一颗树参考另外一颗树进行完全比较更新,那么即使时最先进的算法,该算法的复杂度为 O(n^2),其中 n 是树中元素的数量;
    • 如果在 React 中使用了该算法,那么展示 1000 个元素所需要执行的计算量将在 10 亿的量级范围;
    • 开销过于昂贵,更新性能非常低效;
  • 于是,React 对这个算法进行了优化,将其优化成了 O(n)

    • 同层节点之间相互比较,不会跨节点比较
    • 不同类型的节点,产生不同的树结构
    • 开发中,可以通过 key 来指定哪些节点在不同的渲染下保持稳定
  • keys 的优化

    • 遍历列表时,会提示一个警告,提示我们加入一个 key 属性
    • 当子元素拥有 key 时,React 使用 key 来匹配原有树上的子元素以及最新树上的子元素
      • 例如将 key 为 333 的元素插入到最前面的位置时,key 为 111,222 的元素,仅仅需要进行位移即可,不需要任何修改
  • key 的注意事项

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

    • 为了避免不必要的 render,提高性能,调用 render 应该有一个前提:依赖的数据(state、props)发生改变时,再调用 render 方法
  • 利用shouldComponentUpdate优化 render 调用


// 针对值发生变化的组件
shouldComponentUpdate(nextProps, newState){
  // 对比 state中的值是否有改变
  if (this.state.message !== newState.message || this.state.counter !== newState.counter){
    return true
  }
  return false
}

// 针对其中的子组件
shouldComponentUpdate(nextProps, newState){
  // 1.对比 state中的值是否有改变
  if (this.state.message !== newState.message || this.state.counter !== newState.counter){
    return true
  }
  // 2.检测接收的props是否有改变
  if (this.props.message !== newProps.message){
    return true
  }
  return false
}
  • 如果参数过多,SCU 的方式则过于繁琐,所以通常采用以下方式实现

针对类组件:采用PureComponent 实现优化

import React, { PureComponent } from "react";
export class App extends PureComponent {
  // ...
}

PureComponent中变更数组数据的实际应用:

import React, { PureComponent } from "react";

export class App extends PureComponent {
  constructor() {
    super();

    this.state = {
      books: [
        { name: "book1", price: 199, count: 1 },
        { name: "book2", price: 299, count: 1 },
        { name: "book3", price: 399, count: 2 },
        { name: "book4", price: 499, count: 3 },
        { name: "book5", price: 599, count: 1 },
      ],
    };
  }
  addNewBook() {
    const newBook = {
      name: "book6",
      price: 55,
      count: 1,
    };
    // 错误写法:
    // 直接修改原有的state,重新设置一遍
    // this.state.books.push(newBook);
    // this.setState({
    //   books: this.state.books,
    // });

    // 正确写法:
    // 拷贝一份,在新的数组中更新,设置新的books,而不是直接修改state
    const books = [...this.state.books];
    books.push(newBook);
    this.setState({ books });
  }

  addBookCount(index) {
    console.log(index);
    const books = [...this.state.books];
    books[index].count++;
    this.setState({ books });
  }

  render() {
    const { books } = this.state;
    return (
      <div>
        <h2>books list</h2>
        <ul>
          {books.map((item, index) => {
            return (
              <li key={index}>
                <span>
                  name: {item.name} - price: {item.price} - count: {item.count}
                </span>
                <button onClick={(e) => this.addBookCount(index)}>+1</button>
              </li>
            );
          })}
        </ul>
        <button onClick={(e) => this.addNewBook()}>添加新书籍</button>
      </div>
    );
  }
}

export default App;

针对函数式组件:采用 memo 实现优化文章来源地址https://www.toymoban.com/news/detail-554828.html

import { memo } from "react";
const Profile = memo(function (props) {
  console.log("profile render");
  return <h2>Profile: {props.message}</h2>;
});

export default Profile;

到了这里,关于【前端知识】React 基础巩固(二十三)——React 性能优化 SCU相关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端知识】React 基础巩固(三十三)——Redux的使用详解

    针对 React 基础巩固(三十二) 中的案例,我们希望抽取页面中共有的代码(例如下方的代码),使用高阶组件统一拦截。 为了让react和redux产生联系,安装一款工具 react-redux 使用 react-redux ,在index.js中统一注入store 新建about.js页面,通过 react-redux 引入store 在App.jsx中引入新的

    2024年02月15日
    浏览(41)
  • 【前端知识】React 基础巩固(二十六)——Portals 的使用

    通常,组件会渲染到 root 节点下。可使用 Portals 将组件渲染至其他节点。 添加 id 为 more、modal 的 div 元素 构建 Modal.jsx, 通过 createPortal 把组件渲染到指定的 modal 节点下 构建 App.jsx 查看渲染结果

    2024年02月16日
    浏览(36)
  • 【前端知识】React 基础巩固(二十九)——过渡动画 react-transition-group

    react-transition-group 包含: Transition(该组件是一个和平台无关的组件,不一定结合 CSS) CSSTransition(通常使用此组件实现过渡动画效果) SwitchTransition(两个组件显示/隐藏切换时使用) TransitionGroup(将多个动画包裹其中,一般用于列表中元素的动画) CSSTransition CSSTransition 基于

    2024年02月16日
    浏览(54)
  • 【前端知识】React 基础巩固(三十四)——组件中的异步操作及优化

    通过组件的生命周期来完成网络请求,网络请求的异步代码直接放在组件中 通过redux来管理异步网络请求 在store中引入中间件 redux-thunk 构建 fetchHomeMultidataAction ,将原本在组件中的异步请求代码放入到actionCreators.js中 改写原来的category.jsx,派发异步请求的dispatch 查看运行结果

    2024年02月15日
    浏览(52)
  • 【前端知识】React 基础巩固(三十一)——store数据的订阅和Redux的优化

    store/index.js test.js redux代码优化: 将派发的action生成过程放到一个actionCreators函数中 将定义的所有actionCreators的函数,放到一个独立的文件中:actionCreators.js actionCreators 和 reducer 函数中使用字符串常量是一致的,所以将常量抽取到一个独立的constants.js文件中 将reducer和默认值(

    2024年02月15日
    浏览(37)
  • 【前端知识】React 基础巩固(四十)——Navigate导航

    新建Login页面,在Login中引入Navigate,实现点击登陆按钮跳转至 /home 路径下: 当路由均无匹配时,通过Navigate跳转至NotFound界面,其中 * 为通配符: 构建NotFound.jsx 在App.jsx中配置NotFound: 构建Home的子路由页面: HomeRecommend.jsx HomeRanking.jsx 利用 Route 嵌套子路由,实现Home页面下的

    2024年02月14日
    浏览(51)
  • 【前端知识】React基础巩固(二)——JSX注意点

    createElement存在的问题: 繁琐不简洁 不直观,无法一眼看出所描述的结构 不优雅,开发体验不好 JSX 简介:JSX 是 JavaScript XML 的简写,表示了在JS代码中写XML(HTML)格式的代码 优势:声明式语法更加直观,与HTML结构相同,降低学习成本,提高开发效率 JSX 是 react 的核心内容‘

    2024年02月09日
    浏览(60)
  • 【前端知识】React 基础巩固(四十二)——React Hooks的介绍

    Hook 是 React 16.8 的新增特性,它可以让我们在不编写class的情况下使用state以及其他的React特性(比如生命周期)。 class组件 VS 函数式组件: class的优势: class组件可以定义自己的state,用来保存组件自己内部的状态;而函数式组件不可以,因为函数每次调用都会产生新的临时

    2024年02月14日
    浏览(49)
  • 【前端知识】React 基础巩固(三十一)——Redux的简介

    概念 纯函数(确定的输入一定产生确定的输出,函数在执行过程中不产生副作用): 在程序设计中,若一个函数符合以下条件,那么这个函数就被称为纯函数 此函数在相同的输入值时,需产生相同的输出 函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产

    2024年02月16日
    浏览(39)
  • 【前端知识】React 基础巩固(七)——JSX 的基本语法

    JSX 是一种 JS 的语法扩展(extension),也可以称之为 JavaScript XML,因为看起来就是一段 XML 语法 它用于描述我们的 UI 界面,并且其可以和 JS 融合在一起使用 它不同于 Vue 中的模块语法,不需要专门学习模块语法中的指令 React 认为 渲染逻辑 本质上与 其他UI逻辑 存在内在耦合

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包