• react context


    是什么 

     context,一种组件间通信方式,常用于祖组件和后代组件。父子组件一般不使用。    

     在应用开发中一般不用context, 一般都用它的封装react插件,比如react-redux。

     下图中A和C、D 通信就是祖和后代组件。父子可以用context,但是不常用,因为父子用props更简单。

    使用步骤 

     1) 创建Context容器对象

            注意:需要在祖、后代组件都可以访问到的位置定义context容器。

    const XxxContext = React.createContext()  

    2) 在祖组件定义子组件时,外面包裹xxxContext.Provider, 通过value属性定义值。此时子组件的后代组件就可以接收到数据

            value可以是字符串,也可是对象。

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

    注意:子组件包含后代组件,此时后代组件可以接收到context传值。


    3) 后代组件读取数据

        第一种方式 只有类组件能使用 
          static contextType = xxxContext  // 声明接收context,名字必须是contextType
          this.context // 读取context中的value数据
          
        第二种方式 函数组件与类组件都可以使用

            Consumer里面是一个函数。单个接收值,如果单个返回值可以不写return和大括号。
          <xxxContext.Consumer>
            {
              value => ( // value就是context中的value数据
                要显示的内容
              )
            }
          </xxxContext.Consumer>

    ### 注意

        在应用开发中一般不用context, 一般都用它的封装react插件,比如react-redux。

    代码实现

    A B C D 四个组件,D是函数式组件,其他是类式组件。

    1. import React, { Component, Fragment } from 'react'
    2. import Demo from './05-context'
    3. //1.在祖 后代组件都可以访问的位置定义context容器
    4. const MyContext = React.createContext()
    5. const { Provider, Consumer } = MyContext
    6. export default class A extends Component {
    7. state = { name: "tom" }
    8. render() {
    9. return (
    10. //2.祖组件 定义子组件时 使用Provider包括
    11. <Provider value={"tom"}>
    12. <h3>我是A组件</h3>
    13. <p>我的用户名{this.state.name}</p>
    14. <B />
    15. </Provider>
    16. )
    17. }
    18. }
    19. class B extends Component {
    20. render() {
    21. return (
    22. <>
    23. <h3>我是B组件</h3>
    24. <p>我的用户名{"???"}</p>
    25. <C />
    26. </>
    27. )
    28. }
    29. }
    30. class C extends Component {
    31. //3. 如果后代组件是类组件 可以使用第一种方式接受context值
    32. static contextType = MyContext
    33. render() {
    34. return (
    35. <>
    36. <h3>我是C组件</h3>
    37. <p>我的用户名{this.context}</p>
    38. <D />
    39. </>
    40. )
    41. }
    42. }
    43. function D() {
    44. return (
    45. <>
    46. <h3>我是D组件</h3>
    47. //3. 如果后代组件是函数式组件 接受context可以使用Consumer
    48. <Consumer>{value => `我的用户名${value}`}
    49. </Consumer>
    50. </>
    51. )
    52. }
  • 相关阅读:
    ModStartCMS v7.3.0 富文本MP3支持,后台组件优化
    离散对数问题(DLP) && Diffie-Hellman问题(DHP)
    一文了解蛋白功能结构域预测与分析
    图的最小生成树算法(图解+代码)| 学不会来看我系列
    计算机毕业设计django基于python图书馆借阅系统(源码+系统+mysql数据库+Lw文档)
    Git管理 — 分支管理
    thymeleaf的日常使用
    产品经理-需求分析(三)
    使用vi、vim、sed、echo、cat操作文件
    【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)
  • 原文地址:https://blog.csdn.net/qq_22310551/article/details/125546175