热门标签 | 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. 实现效果
    在这里插入图片描述






推荐阅读
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
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社区 版权所有