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>
        )
    }
}
相关文章
|
12天前
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
37 8
|
10天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
55 2
|
1月前
|
前端开发 JavaScript 网络架构
react对antd中Select组件二次封装
本文介绍了如何在React中对Ant Design(antd)的Select组件进行二次封装,包括创建MSelect组件、定义默认属性、渲染Select组件,并展示了如何使用Less进行样式定义和如何在项目中使用封装后的Select组件。
54 2
react对antd中Select组件二次封装
|
10天前
|
前端开发 JavaScript 算法
React 渲染优化策略
【10月更文挑战第6天】React 是一个高效的 JavaScript 库,用于构建用户界面。本文从基础概念出发,深入探讨了 React 渲染优化的常见问题及解决方法,包括不必要的渲染、大量子组件的渲染、高频事件处理和大量列表渲染等问题,并提供了代码示例,帮助开发者提升应用性能。
37 6
|
9天前
|
前端开发 JavaScript 调度
React 组件状态(State)
10月更文挑战第8天
10 1
|
1月前
|
前端开发
React给antd中TreeSelect组件左侧加自定义图标icon
本文介绍了如何在React中为Ant Design的TreeSelect组件的每个树节点添加自定义图标,并解决了因缺少key属性而导致的警告问题,展示了如何通过递归函数处理treeData数据并为每个节点添加图标。
32 2
React给antd中TreeSelect组件左侧加自定义图标icon
|
1月前
|
前端开发
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
本文介绍了在React项目中如何添加路径别名alias以简化模块引入路径,设置组件props的默认值,以及如何二次封装Ant Design的Modal组件。文章还提供了具体的代码示例,包括配置Webpack的alias、设置defaultProps以及封装Modal组件的步骤和方法。
50 1
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
|
14天前
|
JSON 前端开发 JavaScript
【简单粗暴】如何使用 React 优化 AG 网格性能
【简单粗暴】如何使用 React 优化 AG 网格性能
19 3
|
16天前
|
JavaScript 前端开发 安全
使用 TypeScript 加强 React 组件的类型安全
【10月更文挑战第1天】使用 TypeScript 加强 React 组件的类型安全
32 3
|
28天前
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
29 2