React组件性能优化

简介: React组件性能优化

jsx语法的转化过程

jsx仅仅是createElement()方法的语法糖
jsx语法会被 @balel/preset-react插件编译为createElement()方法

组件的更新机制

setState的两个作用
1.修改state
2.更新组件ui
父组件在重新渲染的时候
子组件也会重新渲染
但是只会渲染当前组件的子树

组件性能优化---减轻state

1.state只存储跟组件渲染相关的数据
不用做渲染相关的数据不要放在state中,比如定时器id
对于需要在放多个方法中用到的数据,应该放在this中
class Father extends React.Component{
  componentDidMount() {
    // 放在this上
    this.timeId = setInterval(() => { 
      console.log('开始执行')
    },500)
  }
  componentWillUnmount() { 
    clearInterval(this.timeId)
  }
  render() { 
    return (
      <div>
        <p>显示的值</p>
      </div>
    )
  }
}

组件性能优化--避免不必要的重新渲染

组件的更新机制:父组件的更新会引起子组件也会被更新
如果子组件没有任何变化时也需要重新渲染的话
怎么避免不必要的更新渲染呢?
可以使用钩子函数 shouldComponentUpdate(nextProps,nextState)
该函数会返回一个值决定组件时候重新渲染
返回true表示需要重新渲染;
false表示不需要重新渲染
下面的伪代码
class Hello extends React.Component{
  shouldComponentUpdate(){
    return false //这个组件不需要重新渲染
  }
  render() { 
    return (
      <div>
        <p>显示的值</p>
      </div>
    )
  }
}
该函数的触发时机:它是更新阶段的钩子函数
组件重新渲染前执行shouldComponentUpdate(){}
下一个钩子函数是render.
如果shouldComponentUpdate返回的是false
render这个钩子函数就不会被执行了。

shouldComponentUpdate返回false

class Father extends React.Component{
  state = {
    num:25
  }
  shouldComponentUpdate(nextProps, nextState) { 
    // 为false,组件是不会更新的,render函数不会被触发
    // 当我们点击按钮的时候,render没有触发,视图就没有更新
    // 当然第一次的时候,render函数的时候肯定是会被触发的。
    return false
  }
  // 新增
  addhandler = () => { 
    this.setState({
      num: this.state.num + 1
    })
  }
  render() { 
    console.log('render函数会被触发')
    return (
      <div>
        <button onClick={this.addhandler}>增加</button>
        <p>显示的值{this.state.num }</p>
      </div>
    )
  }
}

shouldComponentUpdate返回true

class Father extends React.Component{
  state = {
    num:25
  }
  shouldComponentUpdate(nextProps, nextState) { 
    // 为false,组件是不会更新的,render函数不会被触发
    // 当我们点击按钮的时候,render没有触发,视图就没有更新
    // 当然第一次的时候,render函数的时候肯定是会被触发的。
    // 通过this.state.num获取更新前的值 
    console.log('更新前的值', this.state.num)
    console.log('最新的值', nextState)
    return true
  }
  // 新增
  addhandler = () => { 
    this.setState({
      num: this.state.num + 1
    })
  }
  render() { 
    console.log('render函数会被触发')
    return (
      <div>
        <button onClick={this.addhandler}>增加</button>
        <p>显示的值{this.state.num }</p>
      </div>
    )
  }
}

什么时候跟新了

可以通过最新的值和上一次的值 是否一样。一样的话就不进行更新了
shouldComponentUpdate(nextProps, nextState){
    <!-- 最新的值和上一次的值一样 不需要更 -->
    if(nextState.num == this.state.num){
        return false
    }else{
        render teue
    }
    <!-- 可以将上面的代码优化一下 下面的代码更加的好 -->
    return nextState.num!==this.state.num
}

基本数据类型

子组件
import React from "react";
class ListCom extends React.Component{
    shouldComponentUpdate(nextProps) { 
        console.log('是否跟新', nextProps.num !== this.props.num)
        return nextProps.num !== this.props.num
    }
    render() { 
        return (
            <ul>
                <li>{this.props.num }</li>
            </ul>
        )
    }
}
export default ListCom
父页面
class Father extends React.Component{
  state = {
    num:20,
  }
  // 新增
  changehandler = () => { 
    let newValue=30
    this.setState({
      num: newValue
    })
  }
  //不改变
  hander = () => { 
    let valueCont = 20
    this.setState({
      num: valueCont
    })
  }
  render() { 
    return (
      <div>
        <button onClick={this.changehandler}>跟新数据</button>
        <button onClick={this.hander}>原来的值</button>
        <ListCom num={this.state.num}></ListCom>
      </div>
    )
  }
}

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
3月前
|
存储 前端开发 JavaScript
深入理解React Fiber架构及其性能优化
【10月更文挑战第5天】深入理解React Fiber架构及其性能优化
127 1
|
2月前
|
前端开发 JavaScript 算法
探索现代前端框架——React 的性能优化策略
探索现代前端框架——React 的性能优化策略
26 0
|
2月前
|
前端开发 JavaScript API
探索现代前端框架——React 的性能优化策略
探索现代前端框架——React 的性能优化策略
32 0
|
2月前
|
Web App开发 前端开发 JavaScript
React性能优化指南:打造流畅的用户体验
React性能优化指南:打造流畅的用户体验
|
8月前
|
前端开发 API 开发者
你可能没有关注过的 React 性能优化,帮你突破瓶颈
你可能没有关注过的 React 性能优化,帮你突破瓶颈
|
4月前
|
前端开发 JavaScript UED
深入React Hooks与性能优化实践
深入React Hooks与性能优化实践
63 0
|
5月前
|
开发者 搜索推荐 Java
超越传统:JSF自定义标签库如何成为现代Web开发的个性化引擎
【8月更文挑战第31天】JavaServer Faces(JSF)框架支持通过自定义标签库扩展其内置组件,以满足特定业务需求。这涉及创建`.taglib`文件定义标签库及组件,并实现对应的Java类与渲染器。本文介绍如何构建和应用JSF自定义标签库,包括定义标签库、实现标签类与渲染器逻辑,以及在JSF页面中使用这些自定义标签,从而提升代码复用性和可维护性,助力开发更复杂且个性化的Web应用。
80 0
|
5月前
|
前端开发 测试技术 UED
React性能优化的神奇之处:如何用懒加载与代码分割让你的项目一鸣惊人?
【8月更文挑战第31天】在现代Web开发中,性能优化至关重要。本文探讨了React中的懒加载与代码分割技术,通过示例展示了如何在实际项目中应用这些技术。懒加载能够延迟加载组件,提高页面加载速度;代码分割则将应用程序代码分割成多个块,按需加载。两者结合使用,可以显著提升用户体验。遵循合理使用懒加载、编写测试及关注性能等最佳实践,能够更高效地进行性能优化,提升应用程序的整体表现。随着React生态的发展,懒加载与代码分割技术将在未来Web开发中发挥更大作用。
60 0
|
5月前
|
缓存 前端开发 JavaScript
React.memo 与 useMemo 超厉害!深入浅出带你理解记忆化技术,让 React 性能优化更上一层楼!
【8月更文挑战第31天】在React开发中,性能优化至关重要。本文探讨了`React.memo`和`useMemo`两大利器,前者通过避免不必要的组件重渲染提升效率,后者则缓存计算结果,防止重复计算。结合示例代码,文章详细解析了如何运用这两个Hook进行性能优化,并强调了合理选择与谨慎使用的最佳实践,助你轻松掌握高效开发技巧。
124 0
|
6月前
|
缓存 监控 前端开发
react 性能优化方案?
【7月更文挑战第15天】改善React应用性能的关键策略包括:使用生产环境构建减少体积,避免不必要的渲染(如用React.memo或PureComponent),正确设置列表渲染的key,简化组件层级,实施懒加载,避免render中的复杂计算,选择优化过的库,控制重渲染范围,监控性能并合并state更新。这些优化能提升响应速度和用户体验。
69 0