在React中,Context机制是为了方便在组件树间传递数据。

例子

import React from 'react'
const themes={
light:"亮色主题",
dark:"暗色主题"
}
const sexs={
man:"男性",
wem:"女性",
}
const SexContext=React.createContext(sexs.man);
const ThemeContext=React.createContext(themes.dark);
export default class Context extends React.Component {
state={
theme:themes.light,
sex:sexs.wem,
}
render(){
return(
<div>
<ThemeContext.Provider value={this.state.theme}>
<ThemeSwitch />
</ThemeContext.Provider>
<SexContext.Provider value={this.state.sex}>
<SexSwitch />
</SexContext.Provider> </div>
);
}
} class ThemeSwitch extends React.Component { render(){
//let theme=this.context;
return (
<ThemeContext.Consumer>
{value=><button>{value}</button>}
</ThemeContext.Consumer>
);
}
} class SexSwitch extends React.Component {
render(){
let sex=this.context;
return (
<button>
{sex}
</button>
);
}
}
SexSwitch.contextType=SexContext;

这个例子是根据React文档进行修改得到的。

API

Context有几个API是必须要知道的:

React.createContext

作用:创建Context对象

用法:

const MyContext = React.createContext(defaultValue);

MyContext为Context对象名,defaultValue为默认数据。默认数据将会在Cousumer找不到Provider时生效。

Context.Provider

作用:为订阅它的数据在每次value变化时提供更新。

用法:

<MyContext.Provider value={/* 某个值 */}>

Class.contextType

作用:为Class绑定数据源,绑定后可以使用this.context获得Provider的value;

用法:

MyClass.contextType = MyContext;

MyClass为Cousumer所在的组件。

Context.Consumer

作用:在函数式组件中完成订阅context

用法:

<MyContext.Consumer>
{value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>

value即为Provider的value属性

有了上面的知识,就可以对例子进行分析了

例子的解读

在例子中,声明了两个Context,分别代表主题和性别,它们是两个指定按钮的text

ThemeSwitch为通过函数式组件订阅context,

SexSwitch通过语句SexSwitch.contextType=SexContext;将SexSwitch与对应context进行绑定,以便使用this.context获得value值。

在使用时,两者的数据通过state输入。

最后的效果:



当有方法修改state时,将会对按钮的值进行修改。

补充后代码如下:

import React from 'react'
const themes={
light:"亮色主题",
dark:"暗色主题"
}
const sexs={
man:"男性",
wem:"女性",
}
const SexContext=React.createContext(sexs.man);
const ThemeContext=React.createContext(themes.dark);
export default class Context extends React.Component {
state={
theme:themes.light,
sex:sexs.wem,
}
handleSwitch=()=>{
let sex=this.state.sex;
let theme=this.state.theme; this.setState({
sex:sex==sexs.man?sexs.wem:sexs.man,
theme:theme==themes.dark?themes.light:themes.dark, })
}
render(){
return(
<div>
<ThemeContext.Provider value={this.state.theme}>
<ThemeSwitch />
</ThemeContext.Provider>
<SexContext.Provider value={this.state.sex}>
<SexSwitch />
</SexContext.Provider>
<button onClick={this.handleSwitch}>切换</button>
</div>
);
}
} class ThemeSwitch extends React.Component { render(){
//let theme=this.context;
return (
<ThemeContext.Consumer>
{value=><button>{value}</button>}
</ThemeContext.Consumer>
);
}
} class SexSwitch extends React.Component {
render(){
let sex=this.context;
return (
<button>
{sex}
</button>
);
}
}
SexSwitch.contextType=SexContext;

点击前:



点击切换后:

[React]Context机制的更多相关文章

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

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

  2. Flask 的 Context 机制

    转自https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ Flask 的 Context 机制 2014 年 07 月 21 日 ...

  3. React context基本用法

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

  4. [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 ...

  5. 【React】354- 一文吃透 React 事件机制原理

    大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...

  6. React Context API

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

  7. React Hooks +React Context vs Redux

    React Hooks +React Context vs Redux https://blog.logrocket.com/use-hooks-and-context-not-react-and-r ...

  8. [译]React Context

    欢迎各位指导与讨论 : ) 前言 由于笔者英语和技术水平有限,有不足的地方恳请各位指出.我会及时修正的 O(∩_∩)O 当前React版本 15.0.1 时间 2016/4/25 正文 React一个 ...

  9. 理解Go Context机制

    1 什么是Context 最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也 ...

随机推荐

  1. 超全!python的文件和目录操作总结

    文件的基本读写 path = r'C:\Users\Brady\Documents\tmp' with open(path + r'\demo.txt', 'r', encoding='utf-8') ...

  2. ORACLE数据库实现主键自增

    ORACLE数据库是甲骨文公司的一款关系数据库管理系统. 实现主键自动增长需要四个步骤: 去看 创建表格 去看 创建自增序列 去看 创建触发器 去看 插入测试 1.创建表格(必须有主键) -- 创建学 ...

  3. 这些Zepto中实用的方法集

    前言 时间过得可真快,转眼间2017年已去大半有余,你就说吓不吓人,这一年你成长了多少,是否荒度了很多时光,亦或者天天向上,收获满满.今天主要写一些看Zepto基础模块时,比较实用的部分内部方法,在我 ...

  4. preload & prefetch

    原文地址在 我的笔记里,觉得还行就给个 star 吧:) 关于 preload 和 prefetch 早有耳闻,知道它们可以优化页面加载速度,然具体情况却了解不多.搜索了相关的资料后对其有了些认识,在 ...

  5. 使用veloticy-ui生成文字动画

    前言 最近要实现一个类似文字波浪线的效果,使用了velocity-ui这个动画库,第一个感觉就是使用简单,代码量少,性能优异,在此简单介绍一下使用方法,并实现一个看上去不错的动画.具体使用方法可以点击 ...

  6. 动手搞一个Promise

    Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任 ...

  7. 前端每日实战:92# 视频演示如何用纯 CSS 创作一颗逼真的土星

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/EpbaQX 可交互视频 此视频是可 ...

  8. nginx如何连接多个服务?

    记录一下: 刚开始用nginx部署,在项目文件内touch了一个nginx.conf配置文件,然后将这个conf文件软链接到nginx的工作目录中 sudo ln -s /home/ubuntu/xx ...

  9. 【从零单排HBase 01】从一无所知到5分钟快速了解HBase

    最近公司正好准备投入HBase,因此做了一些基础学习准备,所以先暂时停止MySQL的更新,把HBase的学习心得跟大家分享一下,接下来一段时间都会发布HBase相关内容. 在学的过程中,发现跟MySQ ...

  10. 关于nw的简单应用

    最近使用到了桌面开发应用nw.js.进行简单的介绍一下,基本用法 nwjs实际上是基于node js的,支持node js的所有api 中文官网https://nwjs.org.cn/ 第一步.在官网 ...