React---新扩展Context和组件优化

简介: React新特性

一、Context

  1. 理解

   一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信

  1. 使用

  1) 创建Context容器对象:

  const XxxContext = React.createContext()  

  2) 渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据:

  <xxxContext.Provider value={数据}>
      子组件
  </xxxContext.Provider>

  3) 后代组件读取数据:

   //第一种方式:仅适用于类组件

    static contextType = xxxContext  // 声明接收context
    this.context // 读取context中的value数据
  
  //第二种方式: 函数组件与类组件都可以
    <xxxContext.Consumer>
      {
        value => ( // value就是context中的value数据
          要显示的内容
        )
      }
    </xxxContext.Consumer>
  1. 注意
    在应用开发中一般不用context, 一般都用它封装react插件
  2. 代码
import React, { Component } from 'react'
import './index.css'

//创建Context对象
const MyContext = React.createContext()
const {Provider,Consumer} = MyContext
export default class A extends Component {

    state = {username:'tom',age:18}

    render() {
        const {username,age} = this.state
        return (
            <div className="parent">
                <h3>我是A组件</h3>
                <h4>我的用户名是:{username}</h4>
                <Provider value={{username,age}}>
                    <B/>
                </Provider>
            </div>
        )
    }
}

class B extends Component {
    render() {
        return (
            <div className="child">
                <h3>我是B组件</h3>
                <C/>
            </div>
        )
    }
}

/* class C extends Component {
    //声明接收context
    static contextType = MyContext
    render() {
        const {username,age} = this.context
        return (
            <div className="grand">
                <h3>我是C组件</h3>
                <h4>我从A组件接收到的用户名:{username},年龄是{age}</h4>
            </div>
        )
    }
} */

function C(){
    return (
        <div className="grand">
            <h3>我是C组件</h3>
            <h4>我从A组件接收到的用户名:
            <Consumer>
                {value => `${value.username},年龄是${value.age}`}
            </Consumer>
            </h4>
        </div>
    )
}

二、optimize组件优化

  1. Component的2个问题

     1)只要执行setState(),即使不改变状态数据, 组件也会重新render()
     2) 只当前组件重新render(), 就会自动重新render子组件 ==> 效率低

  1. 效率高的做法

    只有当组件的state或props数据发生改变时才重新render()

  1. 原因

    Component中的shouldComponentUpdate()总是返回true

  1. 解决

      方法1:

       重写shouldComponentUpdate()方法
       比较新旧state或props数据, 如果有变化才返回true, 如果没有返回false

       方法2:

       使用PureComponent
       PureComponent重写了shouldComponentUpdate(), 只有state或props数据有变化才返回true
       注意: 
           只是进行state和props数据的浅比较, 如果只是数据对象内部数据变了, 返回false  
           不要直接修改state数据, 而是要产生新数据

      项目中一般使用PureComponent来优化

  2. 代码
import React, { PureComponent } from 'react'
import './index.css'

export default class Parent extends PureComponent {

    state = {carName:"奔驰c36",stus:['小张','小李','小王']}

    addStu = ()=>{
        /* const {stus} = this.state
        stus.unshift('小刘')
        this.setState({stus}) */

        const {stus} = this.state
        this.setState({stus:['小刘',...stus]})
    }

    changeCar = ()=>{
        //this.setState({carName:'迈巴赫'})

        const obj = this.state
        obj.carName = '迈巴赫'
        console.log(obj === this.state);
        this.setState(obj)
    }

    /* shouldComponentUpdate(nextProps,nextState){
        // console.log(this.props,this.state); //目前的props和state
        // console.log(nextProps,nextState); //接下要变化的目标props,目标state
        return !this.state.carName === nextState.carName
    } */

    render() {
        console.log('Parent---render');
        const {carName} = this.state
        return (
            <div className="parent">
                <h3>我是Parent组件</h3>
                {this.state.stus} 
                <span>我的车名字是:{carName}</span><br/>
                <button onClick={this.changeCar}>点我换车</button>
                <button onClick={this.addStu}>添加一个小刘</button>
                <Child carName="奥拓"/>
            </div>
        )
    }
}

class Child extends PureComponent {

    /* shouldComponentUpdate(nextProps,nextState){
        console.log(this.props,this.state); //目前的props和state
        console.log(nextProps,nextState); //接下要变化的目标props,目标state
        return !this.props.carName === nextProps.carName
    } */

    render() {
        console.log('Child---render');
        return (
            <div className="child">
                <h3>我是Child组件</h3>
                <span>我接到的车是:{this.props.carName}</span>
            </div>
        )
    }
}
相关文章
|
3月前
|
前端开发 JavaScript UED
使用React Hooks优化前端应用性能
本文将深入探讨如何使用React Hooks来优化前端应用的性能,重点介绍Hooks在状态管理、副作用处理和组件逻辑复用方面的应用。通过本文的指导,读者将了解到如何利用React Hooks提升前端应用的响应速度和用户体验。
|
3月前
|
监控 前端开发 API
如何优化React性能?
【4月更文挑战第9天】提升React应用性能的关键策略包括:使用React.memo和PureComponent防止不必要的重渲染;实施代码分割减少初始加载时间;借助React Profiler定位性能问题;优化state和props以减小大小和复杂性;设置列表项的key属性;避免内联函数和对象;自定义shouldComponentUpdate或React.memo比较函数;使用虚拟化技术渲染大量列表;通过Context API共享数据;以及利用服务端渲染加速首屏加载。不断监控和调整是优化的核心。
43 9
|
2月前
|
缓存 前端开发 JavaScript
如何对 React 函数式组件进行优化
如何对 React 函数式组件进行优化
|
2月前
|
前端开发 调度
react 使用 Reducer 和 Context 进行纵向扩展
react 使用 Reducer 和 Context 进行纵向扩展
|
3月前
|
前端开发 开发者
React useMemo钩子指南:优化计算性能
React useMemo钩子指南:优化计算性能
|
3月前
|
前端开发
掌握React中的useCallback:优化性能的秘诀
掌握React中的useCallback:优化性能的秘诀
|
3月前
|
前端开发
利用React Hooks优化前端状态管理
本文将深入介绍如何利用React Hooks优化前端状态管理,包括Hooks的概念、使用方法以及与传统状态管理方式的对比分析,帮助前端开发人员更好地理解和应用这一现代化的状态管理方案。
|
3月前
|
存储 前端开发 JavaScript
【思维扩展】状态机与 React 中的状态
【思维扩展】状态机与 React 中的状态
|
3月前
|
前端开发 JavaScript
React渲染性能的优化
React渲染性能的优化
45 2
|
3月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
37 1