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






推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文探讨了如何在 React 和 TypeScript 中使用高阶组件(HOC)来消耗上下文,并详细解释了相关类型定义和实现细节。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文探讨了在不使用服务器控件的情况下,如何通过多种方法获取并修改页面中的HTML元素值。除了常见的AJAX方式,还介绍了其他可行的技术方案。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
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社区 版权所有