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






推荐阅读
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 基于JQuery实现的评分插件
    本文介绍了一个使用JQuery创建的交互式评分控件。当用户将鼠标悬停在星星上时,左侧的星星会变为实心,右侧保持空心,并显示对应的评分等级;移开鼠标后,所有星星恢复为空心状态。 ... [详细]
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • 算法题解析:最短无序连续子数组
    本题探讨如何通过单调栈的方法,找到一个数组中最短的需要排序的连续子数组。通过正向和反向遍历,分别使用单调递增栈和单调递减栈来确定边界索引,从而定位出最小的无序子数组。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍了JSP的三大指令:page、include和taglib,重点探讨了静态包含与动态包含的区别及其应用场景,并解释了如何使用taglib指令引入第三方标签库。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
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社区 版权所有