热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

React-Context使用(共享对于一个组件树而言是“全局”的数据)一.Context概念理解二.Context使用三.Context组件传值实例C




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 相同的算法。

    <MyContext.Provider value&#61;{value}>
    {/* 子组件 */}
    <component/>
    MyContext.Provider>

    • 渲染子组件时&#xff0c;外面包裹 xxxContext.Provider
    • 通过value属性给后代组件传递数据
  3. 后代组件读取数据



    方法一&#xff1a;Class.contextType&#xff0c;仅适用于类组件


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

    • 声明接收 context&#xff0c;使用 static 这个类属性来初始化 contextType
    • 通过 this.context&#xff0c;读取 context 中的 value 数据。


    方法二&#xff1a;Context.Consumer&#xff0c;函数组件与类组件都可以使用。


    <MyContext.Consumer>
    {value &#61;> /* 基于 context 值进行渲染*/}
    MyContext.Consumer>

    • value 就是 context 中的 value 数据

三. Context 组件传值实例
  1. 源码

    import React, { Component } from "react";
    import { createContext } from "react";
    // 创建一个createContext对象
    const CountContext &#61; createContext();
    // 从 Context 中获取 Provider, Consumer
    const { Provider, Consumer } &#61; CountContext;
    export default class A extends Component {
    state &#61; {
    count: 100,
    name: "tom",
    };
    render() {
    const { name, count } &#61; this.state;
    return (
    <div>
    <h2>A组件</h2>
    <h4>数值为&#xff1a;{count}</h4>
    {/* 通过value属性给后代组件传递数据 */}
    <Provider value&#61;{{ name, count }}>
    <B />
    </Provider>
    </div>
    );
    }
    }
    class B extends Component {
    render() {
    return (
    <div>
    <h2>B组件</h2>
    <C />
    <D />
    </div>
    );
    }
    }
    class C extends Component {
    // 声明接收context
    static contextType &#61; CountContext;
    render() {
    // 接收值
    console.log(this.context);
    return (
    <div>
    <h2>C组件</h2>
    <h4>
    接收到的A组件数值为&#xff1a;{this.context.count},名字为&#xff1a;{this.context.name}
    </h4>
    </div>
    );
    }
    }
    function D() {
    return (
    <div>
    <h2>D组件</h2>
    <h4>
    <Consumer>
    {(value) &#61;> {
    // 接收值
    console.log(value);
    return &#96;接收到的A组件数值为&#xff1a;${value.count},名字为&#xff1a;${value.name}&#96;;
    }}
    </Consumer>
    </h4>
    </div>
    );
    }

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






推荐阅读
  • 1.绑定htmlcss1.1对象语法:  传给v-bind:class一个对象,以动态地切换class   ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文介绍了如何利用jQuery实现对网页上多个div元素的显示与隐藏控制,包括基本的toggle方法及更复杂的显示隐藏逻辑。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
author-avatar
爱夫777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有