React context 用法

news2024/9/28 6:10:08

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。

1. 用法

React.createContext

const MyContext = React.createContext(defaultValue);

创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。

只有当组件所处的树中没有匹配到 Provider 时,其 defaultValue 参数才会生效。这有助于在不使用 Provider 包装组件的情况下对组件进行测试。注意:将 undefined 传递给 Provider 的 value 时,消费组件的 defaultValue 不会生效。

Context.Provider

<MyContext.Provider value={/* 某个值 */}>

每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。

Provider 接收一个 value 属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。

Context.Consumer

<MyContext.Consumer>
  {value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>

这里,React 组件也可以订阅到 context 变更。这能让你在函数式组件中完成订阅 context。

2. 实例应用

如图,在父组件中定义两个变量:fruit 和 count。子组件可以拿到父组件的fruit,子子组件可以拿到父组件的 fruit,并且可以改变count的值。

实现步骤如下:

2.1 新建文件 context.js

创建一个Context 对象,并导出Provider和Consumer容器。

import { createContext } from 'react'

export const { Provider, Consumer } = createContext()

2.2 新建父组件 index.js

import React, { Component } from 'react'
import { Provider } from './context' // 引入Provider
import Son from './Son' // 引入子组件

class Main extends Component {
  constructor(props) {
    super(props)
    this.state = {
      fruit: 'apple',
      count: 0,
    }
  }

  componentDidMount() {}

  getContext = () => {
    const { fruit, count } = this.state
    return {
      fruit,
      countUtil: {
        addCount: num => {
          this.setState({
            count: count + num,
          })
        },
        delCount: num => {
          this.setState({
            count: count - num,
          })
        },
      },
    }
  }

  render() {
    const { fruit, count } = this.state
    return (
      // Provider 容器, 其value接收一个getContext方法
      <Provider value={this.getContext()}>
        父组件 fruit = {fruit}, count = {count}
        <hr />
        <Son />
      </Provider>
    )
  }
}

export default Main

2.3 新建子组件 Son.js

import React, { Component } from 'react'
import { Consumer } from './context' // 引入Consumer
import GrandSon from './GrandSon' // 引入子子组件

class Main extends Component {
  constructor(props) {
    super(props)
    this.state = {}
  }

  render() {
    return (
      // Consumer 容器,可以拿到父组件传递下来的 fruit 属性, 并可以展示对应的值
      <Consumer>
        {context => (
          <div>
            子组件 fruit={context.fruit}
            <hr />
            <GrandSon />
          </div>
        )}
      </Consumer>
    )
  }
}

export default Main

2.4 新建子子组件 GrandSon.js

import React, { Component } from 'react'
import { Consumer } from './context' // 引入Consumer

class Main extends Component {
  constructor(props) {
    super(props)
    this.state = {}
  }

  render() {
    return (
      // Consumer 容器,可以拿到父组件传递下来的 fruit 属性, 以及 countUtil对象下的 addCount 和 delCount 方法
      <Consumer>
        {context => (
          <div>
            子子组件 fruit={context.fruit}
            <br />
            <button type="button" onClick={() => context.countUtil.addCount(2)}>
              加2
            </button>
            &nbsp;
            <button type="button" onClick={() => context.countUtil.delCount(3)}>
              减3
            </button>
            <hr />
          </div>
        )}
      </Consumer>
    )
  }
}

export default Main

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务(第六篇)LNMP

第一步、安装nginx&#xff1a; 前期准备&#xff1a; 安装依赖环境&#xff1a; 创建nginx用户和解压&#xff1a; 编译安装nginx&#xff1a; 优化&#xff1a; 进入/usr/local/systemd/system创建nginx.service&#xff08;开启nginx服务&#xff09; 结果&#xff1a; 第…

Vector - CAPL - Panel面板_03

CheckBox 功能&#xff1a;复选框可以用作控制和显示元素&#xff0c;使用它可以启动、显示、使能等选项。 适用场景&#xff1a; 1、特定场景触发某些使能信号&#xff0c;例如转速达到5000r/mi后使能Checkbox&#xff0c;触发错误场景等 2、亦或者将信号设置为特定的值。 3、…

树莓派计算机视觉编程:1~5

原文&#xff1a;Raspberry Pi Computer Vision Programming 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff…

资讯分享 | 华为云携手图扑软件共话行业新发展

华为云携手制造行业同路人共话行业新发展 当前&#xff0c;国家高度重视制造业的“智改数转”&#xff0c;然而面向工业数字化转型的复杂场景&#xff0c;涉及的工业软件和信息软件星罗棋布、不胜枚举。 因此&#xff0c;企业在数字化转型落地过程中会产生语言无法对齐、应用…

(数字图像处理MATLAB+Python)第五章图像增强-第四、五节:基于模糊技术和基于伪彩色处理的图像增强

文章目录 一&#xff1a;基于模糊技术的图像增强&#xff08;1&#xff09;图像的模糊特征平面&#xff08;2&#xff09;算法步骤&#xff08;3&#xff09;程序 二&#xff1a;基于伪彩色处理的图像增强&#xff08;1&#xff09;真彩色、假彩色和伪彩色&#xff08;2&#x…

《扬帆优配》TMT板块或成跨年主线 大消费行业复苏“虽迟但到”

4月14日&#xff0c;第61届我国资本商场高档研讨会暨上证春季所长论坛的圆桌二环节题为“新气象新特征 如何掌握2023年出资主线”&#xff0c;由浙商证券研究所联席所长邱世梁主持。 我国经济延续复苏态势&#xff0c;结构上正在推进以高端制作、安全自主、数字经济为导向的工业…

大型医院健康体检管理系统源码(PEIS)

一、体检管理系统&#xff08;PEIS&#xff09;概念 体检管理系统&#xff08;PEIS&#xff09;是以健康为中心的身体检查。一般医学家认为健康体检是指在身体尚未出现明显疾病时&#xff0c;对身体进行的全面检查。方便了解身体情况&#xff0c;筛查身体疾病。即应用体检手段对…

Unity --- UGUI(Unity Graphical user interface)--- Canvas画布

1.UI --- User Interface --- 使用者与机器之间的交互界面 1.所谓的自适应系统指的是分辨率的适应&#xff1a; 比如在一个分辨率下做的UI放到另一个分辨率下显示时&#xff0c;如果没有自适应系统的话就会导致UI过大&#xff0c;过小&#xff0c;被辟成一半等等情况&#xff…

文心一言眼里的SQL世界

目录 一、Java基础教程系列二、先听听文心一言怎么说&#xff1f;三、话不多说&#xff0c;开干。1、要有一个正确的数据库学习路线&#xff0c;做一个细致的MySQL学习规划。2、学习资料推荐 四、MySQL基础知识总结五、MySQL进阶六、Redis和MongoDB需要学吗&#xff1f;七、如何…

代码随想录Day56

今天继续学习动规解决子序列问题。 674.最长连续递增子序列 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 …

GeoPandas 笔记:合并数据

很多地方和 pandas 笔记&#xff1a;合并操作_pandas 表格判断行空则合并行居中_UQI-LIUWJ的博客-CSDN博客是类似的 1 导入数据 import geopandas import pandas as pd world geopandas.read_file(geopandas.datasets.get_path(naturalearth_lowres)) world cities geopand…

《快速掌握PyQt5》专栏整理成书出版啦!

首先非常感谢大家对《快速掌握PyQt5》专栏的喜爱与支持&#xff01;该专栏现已整理成书出版&#xff0c;书名为《PyQt编程快速上手》。 本书内容在专栏内容的基础上进行了多方面的优化&#xff0c;内容更加丰富&#xff0c;知识点布局更加合理&#xff0c;代码和解释也更加简洁…

Zookeeper源码分析——ZK选举源码解析

ZK选举源码解析 Zookeeper选举机制——第一次启动 Zookeeper选举机制——非第一次启动 ZK选举源码解析 ZK选举准备源码解析 public synchronized void start() {if (!getView().containsKey(myid)) {throw new RuntimeException("My id " myid " not in the …

Camunda流程引擎 Modeler (二)

Camunda Modeler是Camunda官方提供的建模器&#xff1a; Modeler - 独立安装的建模器&#xff08;[windows、linux、mac] 一、下载camunda-modeler Download The Camunda BPMN / DMN Process Modeler | Camunda Release v5.10.0 camunda/camunda-modeler GitHubAn integrate…

深度强化学习【1】-强化学习入门必备基础(含Python迷宫游戏求解实例)

强化学习入门必备基础 文章目录 强化学习入门必备基础1. 强化学习与机器学习1.1 有监督学习1.2 半监督学习1.3 无监督学习1.4 强化学习1.5 深度学习 2. 强化学习中的一些概念2.1 智能体、动作、状态2.2 策略函数、奖励2.3 状态转移2.4 智能体与环境的交互过程2.5 折扣奖励2.6 动…

【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】

Leetcode Leetcode-21.合并两个有序链表Leetcode-83.删除排序链表中的重复元素 Leetcode-21.合并两个有序链表 题目&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 […

CUDA编程一天入门

目录 0 环境准备 1 套路 2 并行执行内核设置 3 示例代码simpleTexture3D 4 参考链接 0 环境准备 1 套路 CUDA 编程模型是一个异构模型&#xff0c;其中同时使用 CPU 和 GPU。在 CUDA 中&#xff0c;主机是指 CPU 及其内存&#xff0c;而设备是指 GPU 及其内存。在主机…

Prophet学习(三)饱和的预测与饱和最低

目录 饱和的预测&#xff08;Forecasting Growth&#xff09; 饱和最低&#xff08;Saturating Minimum&#xff09; 饱和的预测&#xff08;Forecasting Growth&#xff09; 默认情况下&#xff0c;Prophet使用线性模型进行预测。在预测增长时&#xff0c;通常有一个最大可达…

Ubuntu22.04lts NVIDIA驱动安装

1. NVIDIA驱动安装 1.1 手动安装 驱动下载地址&#xff1a;NVIDIA Driver Downloads 注意要在文本模式安装&#xff0c;进入文本模式的方法&#xff1a;sudo init 3。 返回图形化界面的方法sudo init 5 安装时报错&#xff1a; 安装NVIDIA驱动&#xff08;手动安装NVIDIA-L…

两种方式,轻松实现ChatGPT联网

两种方式效果&#xff1a; 方式一&#xff1a;浏览器搜索内嵌插件 方式二&#xff1a;官方聊天页内嵌插件 首先&#xff0c;要有一个谷歌浏览器&#xff0c;然后再安装一个叫ChatGPT for Google&#xff0c;直接在谷歌里搜一下就能找&#xff0c;也可以Chrome应用商店里搜索&a…