React组件及其优化

简介: React组件及其优化

(一)组件化入门介绍

1.什么是组件化开发?

  • 组件化开发其实就是分而治之的思想
  • 我们可以将一个完整的界面拆分成多个小的界面, 每个小的界面就是一个组件,每个组件管理自己的状态(数据)和业务逻辑
  • 这样做的既可以提高每个组件的复用性, 又可能降低每个组件的开发难度
  1. 如何定义组件
  • 通过构造函数定义(函数组件, 无状态组件, 展示型组件)
  • 通过类定义(类组件, 有状态组件, 逻辑组件)
  1. 编写组件

//**`index文件`**
import ReactDOM from 'react-dom';
import React from 'react';
import App from './App';
ReactDOM.render(<App/>, document.getElementById('root'));

//**`App.js文件`**
import React from 'react';
import Header from './Components/Header.js'
import Main from './Components/Main.js'
import Footer from './Components/Footer.js'
class App extends React.Component{
    render(){
        return (
            <div>
                <Header/>
                <Main/>
                <Footer/>
            </div>
        )
    }
}
export default App;

//Header.js文件
import React from 'react';
import './Header.css'
function Header() {
    return (
        <div className={'header'}>我是头部2</div>
    )
}
export default Header;

//Main.js文件
import React from 'react';
import './Main.css'
import Header from "./Header";
function Main() {
    return (
        <div className={'main'}>我是中间2</div>
    )
}
export default Main;

//Footer.js文件
import React from 'react';
import './Footer.css'
import Main from "./Main";
function Footer() {
    return (
        <div className={'footer'}>我是底部2</div>
    )
}
export default Footer;

层级结构为

27.png


目录结构.png

(二)react组件优化

1. 为什么需要优化?那些地方存在一些性能消耗

父组件数据发生变化而子组件不发生改变父组件更新渲染子组件也需要同时重新渲染一遍

  • 1.嵌套组件的render调用
    默认情况下, 只要父组件render被调用, 那么所有后代组件的render也会被调用
  • 2.当前存在的问题
    如果我们只修改了父组件的数据, 并没有修改子组件的数据, 并且子组件中也没有用到父组件中的数据
    那么子组件还是会重新渲染, 子组件的render方法还是会重新执行, 这样就带来了性能问题
    https://zh-hans.reactjs.org/docs/react-component.html#shouldcomponentupdate
组件优化三部曲
一、优化进阶方法一:

通过shouldComponentUpdate生命周期对比组件的当前state和nextstate中的数据是否一样判断是否需要重新渲染render

shouldComponentUpdate(nextProps, nextState, nextContext) {
        // return true;
        // return false;
        if(this.state.age !== nextState.age){
            return true;
        }
        return false;
    }

class Home extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            age : 18
        }
    }
    shouldComponentUpdate(nextProps, nextState, nextContext) {
        if(this.state.age !== nextState.age){
            return true;
        }
        return false;
    }
    render(){
        console.log('Home-render被调用');
        return (
            <div>
                <p>{this.state.age}</p>
            </div>
        )
    }
}
class App extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            name : 'lnj'
        }
    }
    render(){
        console.log('App-render被调用');
        return (
            <div>
                <p>{this.state.name}</p>
                <button onClick={()=>{this.btnClick()}}>APP按钮</button>
                <Home/>
            </div>
        )
    }
    btnClick(){
        this.setState({
            name:''小单"
        })
    }
}
export default App;
二-优化进阶方法二PureComponent(推荐)

方法二其实在优化就是进阶方法一的自动化版本

1.shouldComponentUpdate存在的问题

所有需要优化子组件都需要实现这个方法, 但这个方法并没有技术含量

2.解决方法

让组件继承于PureComponent, 让React自动帮我们实现

// class Home extends React.Component{
class Home extends React.PureComponent{
    constructor(props){
        super(props);
        this.state = {
            age : 18
        }
    }
    /*
    shouldComponentUpdate(nextProps, nextState, nextContext) {
        if(this.state.age !== nextState.age){
            return true;
        }
        return false;
    }
    */
    render(){
        console.log('Home-render被调用');
        return (
            <div>
                <p>{this.state.age}</p>
            </div>
        )
    }
}
class App extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            name : 'lnj'
        }
    }
    render(){
        console.log('App-render被调用');
        return (
            <div>
                <p>{this.state.name}</p>
                <button onClick={()=>{this.btnClick()}}>APP按钮</button>
                <Home/>
            </div>
        )
    }
    btnClick(){
        this.setState({
            name:'单佳兰'
        })
    }
}
export default App;
三-优化进阶方法三(函数式组件React memo方法)

对于函数式组件来说:

  • 没有继承关系
  • 没有生命周期方法
  1. 函数组件的性能优化
    对于类组件, 我们可以通过实现shouldComponentUpdate方法, 或者继承于PureComponent
    来解决性能优化问题, 但是对于函数式组件, 是没有生命周期的, 是没有继承关系的
    那么在函数式组件中如何解决性能优化问题呢?
  2. 通过React.memo()高阶函数
    React.memo()会返回一个优化后的组件给我们

const PurHome = React.memo(function() {
    console.log('Home-render被调用');
    return (
        <div>
            <p>Home</p>
        </div>
    )
});

class App extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            name : 'HUST'
        }
    }
    render(){
        console.log('App-render被调用');
        return (
            <div>
                <p>{this.state.name}</p>
                <button onClick={()=>{this.btnClick()}}>APP按钮</button>
                <PurHome/>
            </div>
        )
    }
    btnClick(){
        this.setState({
            name:'CCNU'
        })
    }
}
export default App;
state的注意点

1.state注意点

永远不要直接修改state中的数据 如果要修改state中的数据, 必须通过setState传递一个新的值

class App extends React.PureComponent{
    constructor(props){
        super(props);
        this.state = {
            age : 0
        }
    }
    render(){
        console.log('App-render被调用');
        return (
            <div>
                <p>{this.state.age}</p>
                <button onClick={()=>{this.btnClick()}}>APP按钮</button>
            </div>
        )
    }

btnClick()实现的两种方法:

方法一:创建一个新对象

this.setState({
           age:this.state.age + 1
       })

方法二:修改原来的state(和state永远不要修改的原则相违背,极其不推荐)

这种方法使用purecomponent不会更新界面,因为修改为state使得this.state=nextState,因此返回FALSE

btnClick(){
        this.state.age = this.state.age + 1;
        this.setState(this.state);
    }



目录
相关文章
|
1月前
|
前端开发 JavaScript 算法
React 渲染优化策略
【10月更文挑战第6天】React 是一个高效的 JavaScript 库,用于构建用户界面。本文从基础概念出发,深入探讨了 React 渲染优化的常见问题及解决方法,包括不必要的渲染、大量子组件的渲染、高频事件处理和大量列表渲染等问题,并提供了代码示例,帮助开发者提升应用性能。
51 6
|
1月前
|
JSON 前端开发 JavaScript
【简单粗暴】如何使用 React 优化 AG 网格性能
【简单粗暴】如何使用 React 优化 AG 网格性能
29 3
|
6月前
|
监控 前端开发 API
如何优化React性能?
【4月更文挑战第9天】提升React应用性能的关键策略包括:使用React.memo和PureComponent防止不必要的重渲染;实施代码分割减少初始加载时间;借助React Profiler定位性能问题;优化state和props以减小大小和复杂性;设置列表项的key属性;避免内联函数和对象;自定义shouldComponentUpdate或React.memo比较函数;使用虚拟化技术渲染大量列表;通过Context API共享数据;以及利用服务端渲染加速首屏加载。不断监控和调整是优化的核心。
61 9
|
3月前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
73 1
|
3月前
|
前端开发 UED 开发者
React组件优化全攻略:深度解析让你的前端应用飞速运行的秘诀——从PureComponent到React.memo的彻底性能比较
【8月更文挑战第31天】在构建现代Web应用时,性能是提升用户体验的关键因素。React作为主流前端库,其组件优化尤为重要。本文深入探讨了React组件优化策略,包括使用`PureComponent`、`React.memo`及避免不必要的渲染等方法,帮助开发者显著提升应用性能。通过实践案例对比优化前后效果,不仅提高了页面渲染速度,还增强了用户体验。优化React组件是每个开发者必须关注的重点。
65 0
|
3月前
|
前端开发 UED 开发者
React.lazy()与Suspense:实现按需加载的动态组件——深入理解代码分割、提升首屏速度和优化用户体验的关键技术
【8月更文挑战第31天】在现代Web应用中,性能优化至关重要,特别是减少首屏加载时间和提升用户交互体验。React.lazy()和Suspense组件提供了一种优雅的解决方案,允许按需加载组件,仅在需要渲染时加载相应代码块,从而加快页面展示速度。Suspense组件在组件加载期间显示备选内容,确保了平滑的加载过渡。
140 0
|
3月前
|
缓存 前端开发 JavaScript
深入探索优化React应用程序的策略
【8月更文挑战第20天】
43 0
|
5月前
|
缓存 前端开发 JavaScript
如何对 React 函数式组件进行优化
如何对 React 函数式组件进行优化
|
6月前
|
前端开发 开发者
React useMemo钩子指南:优化计算性能
React useMemo钩子指南:优化计算性能
|
6月前
|
前端开发
掌握React中的useCallback:优化性能的秘诀
掌握React中的useCallback:优化性能的秘诀