• react原理篇:组件性能优化(减轻state、使用纯组件PureComponent避免不必要的重新渲染)


    目录

    一 减轻state

    二 避免不必要的重新渲染

    2.1 基础使用

     2.2 随机数案例(使用nextState比较)

     2.3 随机数案例(使用nextProps比较)

    三 纯组件PureComponent

     3.1 纯组件的基本使用

    3.2 纯组件原理


    一 减轻state


    只存储组件渲染相关的数据(比如count、列表数据、loading等)
    注意:不用做页面渲染的数据不要放在state中(比如定时器、id等),可以放在this中

    二 避免不必要的重新渲染

    2.1 基础使用

    组件更新机制: 父组件更新会引起子组件也被更新(子组件没有任何变化也会重新渲染)

    :如何避免不必要的渲染?
    答:用钩子函数shouldComponentUpdate解决(返回true重新渲染,返回false不重新渲染
    → 该函数属于更新阶段的钩子函数,在组件重新渲染render前执行


    完整代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. class App extends React.Component {
    4. state = {
    5. count: 1
    6. }
    7. fn = () => {
    8. this.setState((state, props) => {
    9. return {
    10. count: state.count + 1
    11. }
    12. }, () => {
    13. console.log("更新的:" + this.state.count)
    14. })
    15. }
    16. shouldComponentUpdate(nextProps, nextState) {
    17. //最新的状态
    18. console.log("nextState:",nextState)
    19. //更新前的状态
    20. console.log("this.state:",this.state)
    21. //返回false 阻止组件重新渲染
    22. return false;
    23. }
    24. render() {
    25. return (
    26. <div>
    27. <p>count:{this.state.count}p>
    28. <button onClick={this.fn}>点我button>
    29. div>)
    30. }
    31. }
    32. ReactDOM.render(<App/>, document.getElementById("root"));

    效果

    点击按钮3次,state里的count的最新值是4,因为使用了钩子函数shouldComponentUpdate, return 了 false, 所以不重新渲染页面, 所以页面上的count还是1 (备注:this.state里面的count值为3 是因为setState更新数据是异步的,所以count的最新值还没有更新过来)

    关于setState异步更新请点这里

     

    把钩子函数shouldComponentUpdate的返回值改为true (允许组件重新渲染),点击按钮三次.页面的count值又恢复了

     

     2.2 随机数案例(使用nextState比较)

    实现效果: 当两次生成的随机数不一样的时候才重新渲染页面

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. class App extends React.Component {
    4. state = {
    5. number: 0
    6. }
    7. fn = () => {
    8. this.setState(() => {
    9. return {
    10. number:Math.floor(Math.random()*3)
    11. }
    12. })
    13. }
    14. shouldComponentUpdate(nextProps, nextState) {
    15. //最新的状态
    16. console.log("最新的状态:",nextState)
    17. //更新前的状态
    18. console.log("上一次的状态:",this.state)
    19. //当两次生成的随机数是一样的时候,不重新渲染页面
    20. // if(nextState.number===this.state.number){
    21. // return false;
    22. // }
    23. // return true;
    24. //当两次生成的随机数不一样的时候才重新渲染页面
    25. return nextState.number!==this.state.number
    26. }
    27. render() {
    28. console.log("render")
    29. return (
    30. <div>
    31. <p>随机数:{this.state.number}p>
    32. <button onClick={this.fn}>产生随机数button>
    33. div>)
    34. }
    35. }
    36. ReactDOM.render(<App/>, document.getElementById("root"));

    效果

     2.3 随机数案例(使用nextProps比较)

    代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. class App extends React.Component {
    4. state = {
    5. number: 0
    6. }
    7. fn = () => {
    8. this.setState(() => {
    9. return {
    10. number:Math.floor(Math.random()*3)
    11. }
    12. })
    13. }
    14. render() {
    15. console.log("父组件的render")
    16. return (
    17. <div>
    18. <Box number={this.state.number}/>
    19. <button onClick={this.fn}>产生随机数button>
    20. div>)
    21. }
    22. }
    23. class Box extends React.Component{
    24. shouldComponentUpdate(nextProps){
    25. console.log("最新的props:",nextProps,"上一次的props:",this.props)
    26. if(nextProps.number!==this.props.number){
    27. return true;
    28. }
    29. return false;
    30. }
    31. render(){
    32. console.log("子组件的render")
    33. return <p>随机数:{this.props.number}p>
    34. }
    35. }
    36. ReactDOM.render(<App/>, document.getElementById("root"));

     效果

    三 纯组件PureComponent

     3.1 纯组件的基本使用

    为什么要用纯组件?
    纯组件内部自动实现了shouldComponentUpdate这个钩子函数,不需要手动比较

    使用方法:继承 React.PureComponent
     

     代码

    1. import React from "react";
    2. import ReactDOM from "react-dom";
    3. class App extends React.PureComponent {
    4. state = {
    5. number: 0
    6. }
    7. fn = () => {
    8. this.setState(() => {
    9. return {
    10. number:Math.floor(Math.random()*3)
    11. }
    12. })
    13. }
    14. render() {
    15. return (
    16. <div>
    17. <Box number={this.state.number}/>
    18. <button onClick={this.fn}>产生随机数button>
    19. div>)
    20. }
    21. }
    22. class Box extends React.PureComponent{
    23. render(){
    24. console.log("子组件的render")
    25. return <p>随机数:{this.props.number}p>
    26. }
    27. }
    28. ReactDOM.render(<App/>, document.getElementById("root"));

    3.2 纯组件原理

     

     

  • 相关阅读:
    【ubuntu中的docker记录】—— 使用docker的常用的指令记录,持续更新中
    记录一次排查OOM记录 mac电脑
    google登录k8s dashboard ui显示“您的连接不是私密连接”问题解决梳理
    2022年11月13日 开学第十周树状数组
    如何删除数组中的某个元素?
    IP-Guard如何禁止运行U盘程序
    Lecture 3 Process Concept(进程概念)
    数据库脏读、不可重复读、幻读以及对应的隔离级别
    虎牙、斗鱼同道同命:共同御寒
    被Linux之父骂醒?英伟达破天荒开源GPU内核驱动,网友:活久见
  • 原文地址:https://blog.csdn.net/m0_45877477/article/details/126041452