React - Context 使用(共享对于一个组件树而言是 “全局” 的数据)
创始人
2024-03-28 03:26:06
0

React - Context 使用(共享对于一个组件树而言是 “全局” 的数据)

  • 一. Context 概念理解
  • 二. Context 使用
  • 三. Context 组件传值实例

Context官网: https://zh-hans.reactjs.org/docs/context.html

一. Context 概念理解

  1. Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。
  2. React的 context 就是一个全局变量,可以从根组件跨级别在React的组件中传递。
  3. 通常用于 祖组件后代组件 之间通信。

二. Context 使用

  1. 创建一个 Context 对象

    // 从 react 中引入 createContext
    import { createContext } from "react";
    // 创建一个 Context 对象
    const MyContext = createContext(defaultValue);
    
    • 只有当组件所处的树中没有匹配到 Provider 时,其 defaultValue 参数才会生效。
    • 此默认值有助于在不使用 Provider 包装组件的情况下对组件进行测试。
  2. 渲染子组件

    1. 每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。
    2. Provider 接收一个 value 属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。
    3. Providervalue 值发生变化时,它内部的所有消费组件都会重新渲染。从 Provider 到其内部 consumer 组件(包括 .contextTypeuseContext)的传播不受制于 shouldComponentUpdate 函数,因此当 consumer 组件在其祖先组件跳过更新的情况下也能更新。
    4. 通过新旧值检测来确定变化,使用了与 Object.is 相同的算法。
    {/* 子组件 */}
    
    
    • 渲染子组件时,外面包裹 xxxContext.Provider
    • 通过value属性给后代组件传递数据
  3. 后代组件读取数据

    方法一:Class.contextType,仅适用于类组件

    class MyClass extends React.Component {// 声明接收context,使用 static 这个类属性来初始化 contextTypestatic contextType = MyContext;render() {// 读取context中的value数据let value = this.context;/* 基于这个值进行渲染工作 */}
    }
    
    • 声明接收 context,使用 static 这个类属性来初始化 contextType
    • 通过 this.context,读取 context 中的 value 数据。

    方法二:Context.Consumer,函数组件与类组件都可以使用。

    {value => /* 基于 context 值进行渲染*/}
    
    
    • value 就是 context 中的 value 数据

三. Context 组件传值实例

  1. 源码
    import React, { Component } from "react";
    import { createContext } from "react";// 创建一个createContext对象
    const CountContext = createContext();
    // 从 Context 中获取 Provider, Consumer
    const { Provider, Consumer } = CountContext;
    export default class A extends Component {state = {count: 100,name: "tom",};render() {const { name, count } = this.state;return (

    A组件

    数值为:{count}

    {/* 通过value属性给后代组件传递数据 */}{ name, count }}>
    );} }class B extends Component {render() {return (

    B组件

    );} }class C extends Component {// 声明接收contextstatic contextType = CountContext;render() {// 接收值console.log(this.context);return (

    C组件

    接收到的A组件数值为:{this.context.count},名字为:{this.context.name}

    );} }function D() {return (

    D组件

    {(value) => {// 接收值console.log(value);return `接收到的A组件数值为:${value.count},名字为:${value.name}`;}}

    ); }
  2. 实现效果
    在这里插入图片描述

相关内容

热门资讯

无锡律师行业前景与老律师经验传... 在无锡、常州、苏州、镇江、南通等地,律师行业正展现出蓬勃的发展态势,无锡律师行业前景更是备受瞩目。随...
南京市廉政文化研究会应邀赴西安... 扬子晚报网12月28日讯(通讯员 杨雅舒 邵加宝 记者 闫春旭)12月28日,由陕西省廉政文化研究会...
北京放宽购房门槛,优化住房信贷...   为更好满足居民刚性和多样化改善性住房需求,北京进一步优化调整房地产相关政策。   12月24日,...
刘百奇:政策与市场双轮驱动——... 12月28日,由创业黑马主办的“第17届创业家年会”在北京举办,年会主题为“智业革命 —— 跨越断层...
原创 郑... 自从被曝与前夫张恒在国外合开代孕机构之后,郑爽突然又活跃了起来,舆论都过去了,以郑爽名义成立的几个账...
成都警方通报燃爆事件:段某因纠... 2025年12月28日,成都市公安局高新区分局发布警情通报: 来源:成都公安
原创 从... 古代传统婚姻讲究“聘则为妻,奔则为妾”,这句话出自《礼记.内则》,将妻和妾的关系区分的很明白。娶妻不...
成都警方:一男子因纠纷引发燃爆... 12月28日,成都市公安局高新区分局发布警情通报: 12月28日下午,我区南三环路四段一汽车销售服务...
高新区一4S店发生燃爆致1死4... 12月28日,成都市公安局高新公安分局发布警情通报称,2025年12月28日下午,高新区南三环路四段...
吉利起诉欣旺达索赔23亿,最“... 文 | 超聚焦 辛辛苦苦干两年,结果到头还赔钱。 12月26日,欣旺达发布公告称,子公司欣旺达动力...