前言

注意: 从 React v15.5 开始 ,React.PropTypes 助手函数已被弃用,我们建议使用 prop-types 库 来定义contextTypes

首先你需要通过在终端npm install prop-types安装一个叫prop-types的第三方包

context分为新版后旧版,这里都介绍下

一 context旧版使用步骤

1.1 根组件childContextTypes属性

定义静态属性

getChildContext 指定的传递给子组件的属性需要先通过 childContextTypes 来指定,不然会产生错误

// 声明Context对象属性
static childContextTypes = {
propA: PropTypes.string,
visibleA:PropTypes.string,
methodA: PropTypes.func
}

1.2 根组件getChildContext方法

返回context对象, 指定子组件可以使用的信息

// 返回Context对象,方法名是约定好的
getChildContext () {
return {
propA: this.state.propA,
methodA: this.changeStateByChildren
}
}

注意:如果context的值是动态的采用state管理,更改某个context值时,改变根组件的state

1.3 子组件contextTypes静态属性

调用context先定义静态属性,根据约定好的参数类型,否则会出现未定义

子组件需要通过 contextTypes 指定需要访问的元素。 contextTypes 没有定义, context 将是一个空对象。

static contextTypes = {
propA: PropTypes.string,
methodA:PropTypes.func
}

1.4 下文改变context的值,通过context的函数去改变根组件的状态即可

新版context的使用步骤和方法:更好的解释了生产者和消费者模式

1.5 例子

父组件Greeter

class Greeter extends Component {
constructor(props) {
super(props);
this.state = {
add: 87,
remove: 88,
};
}
static childContextTypes = {
add: PropTypes.number,
remove: PropTypes.number,
}
getChildContext() {
const { add, remove } = this.state;
return {
add,
remove,
};
}
render() {
return (
<div>
<ComponetReflux />
</div>
);
}
}

子组件ComponetReflux

class ComponetReflux extends Component {
constructor(props) {
super(props);
this.state = { };
}
static contextTypes = {
add: PropTypes.number,
remove: PropTypes.number,
}
render() {
console.log(this.context); // 打印{add:87,remove:88}
const { name, age } = this.state;
return (
<div>测试context</div>
);
}
}

二 新版context的使用步骤和方法

更好的解释了生产者和消费者模式

2.1 先定义全局context对象

import React from 'react'

const GlobalContext = React.createContext()
export default GlobalContext

2.2 根组件引入GlobalContext,并使用GlobalContext.Provider(生产者)

<GlobalContext.Provider
value={{
background: 'green',
color: 'white',
content:this.state.content,
methodA:this.changeStateByChildren
}}
/>

注意:传入的value为根context对象的值,如果是动态的,使用状态管理

2.3 子组件引入GlobalContext并调用context,使用GlobalContext.Consumer(消费者)

<GlobalContext.Consumer>
{
context => {
return (
<div>
<h1 style={{background: context.background, color: context.color}}>
{context.content}
</h1>
<Input methodA = {context.methodA} value={context.content}></Input>
</div>
)
}
}
</GlobalContext.Consumer>

注意:GlobalContext.Consumer内必须是回调函数,改变context,通过context方法改变根组件状态

三 context优缺点:

优点:跨组件访问数据

缺点:react组件树种某个上级组件shouldComponetUpdate 返回false,当context更新时,不会引起下级组件更新

React Context上下文的更多相关文章

  1. react入门(六):状态提升&context上下文小白速懂

    一.状态提升 使用 react 经常会遇到几个组件需要共用状态数据的情况.这种情况下,我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理. 原理:父组件基于属性把自己的一个fn函数传递给子组 ...

  2. React context基本用法

    React的context就是一个全局变量,可以从根组件跨级别在React的组件中传递.React context的API有两个版本,React16.x之前的是老版本的context,之后的是新版本的 ...

  3. React Context API

    使用React 开发程序的时候,组件中的数据共享是通过数据提升,变成父组件中的属性,然后再把属性向下传递给子组件来实现的.但当程序越来越复杂,需要共享的数据也越来越多,最后可能就把共享数据直接提升到最 ...

  4. 支持“***Context”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

    在用VS进行MVC开发的过程中遇到如下问题: 支持“***Context”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft ...

  5. Context 上下文

    全称:context 解释:上下文,在我们的开发的程序中,通常使用context上下文. 理解:结合实际生活我们可以把它理解为是语境,比如A说:我喜欢他. 那么这个他是谁,我们不知道,如果在这句话之前 ...

  6. Entity Framework Context上下文管理(CallContext 数据槽)

    Context上下文管理 Q1:脏数据 Q2:一次逻辑操作中,会多次访问数据库,增加了数据库服务器的压力 >在一次逻辑操作中实现上下文实例唯一 方法一:单例模式:内存的爆炸式增长 在整个运行期间 ...

  7. [React] Prevent Unnecessary Rerenders of Compound Components using React Context

    Due to the way that React Context Providers work, our current implementation re-renders all our comp ...

  8. 有些lambda表达式就可以体现出编程中「Context(上下文)」环境

    编程中什么是「Context(上下文)」?   每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行 ...

  9. 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)

    Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, React 也从 ...

随机推荐

  1. Python3.x安装教程及环境变量配置

    python3.x安装 1.直接到官网https://www.python.org/下载,安装就可以了. 2.安装比较简单,点exe文件一直下一步就可以了(注意:安装的时候有个选择是否添加环境变量,这 ...

  2. vmware centos共享文件夹

    vmware centos共享文件夹 查看VMware Tools 是否安装成功 <pre>vmware-hgfsclient</pre> 出现共享文件夹<pre> ...

  3. tcpdump抓包工具

    tcpdump抓包工具 一:TCPDump介绍 ​ TcpDump可以将网络中传送的数据包的"头"完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and ...

  4. 【SQL SERVER】2017 Developer 安装教程

    官网下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 1.下载之后双击exe文件,选择基本 自定义都行 2.选择 ...

  5. java编程思想第四版第十章总结

    1. 内部类的特性 他允许你把一些逻辑相关的类组织在一起. 2. 使用.this 如果你需要在内部类中堆外部类进行应用,可以使用外部类的名字后面加.this.下面展示了如何使用 .this packa ...

  6. 使用Jquery获取指定属性的值

    使用Jquery获取指定属性的值 <input type="hidden" value="{$time}" name="time" i ...

  7. Mybatis动态SQL(where元素、set元素、if元素)

    Mybatis动态SQL(where元素.set元素.if元素) - where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句.而且,若语句的开头为“AND”或 ...

  8. C语言I博客作业09

    问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-4/homework/10034 我 ...

  9. 网络图片的获取以及二级缓存策略(Volley框架+内存LruCache+磁盘DiskLruCache)

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  10. Java虚拟机之栈

    一.程序计数器(寄存器):PCR 作用:记住下一条JVM指令的执行地址. 特点:①线程私有的 ②不会存在内存溢出 二.虚拟机栈 1.定义 虚拟机栈:线程运行所需要的内存空间. 栈帧:一个栈帧对应一个方 ...