[React]Context机制
在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机制的更多相关文章
- 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)
Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, React 也从 ...
- Flask 的 Context 机制
转自https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ Flask 的 Context 机制 2014 年 07 月 21 日 ...
- React context基本用法
React的context就是一个全局变量,可以从根组件跨级别在React的组件中传递.React context的API有两个版本,React16.x之前的是老版本的context,之后的是新版本的 ...
- [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 ...
- 【React】354- 一文吃透 React 事件机制原理
大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...
- React Context API
使用React 开发程序的时候,组件中的数据共享是通过数据提升,变成父组件中的属性,然后再把属性向下传递给子组件来实现的.但当程序越来越复杂,需要共享的数据也越来越多,最后可能就把共享数据直接提升到最 ...
- React Hooks +React Context vs Redux
React Hooks +React Context vs Redux https://blog.logrocket.com/use-hooks-and-context-not-react-and-r ...
- [译]React Context
欢迎各位指导与讨论 : ) 前言 由于笔者英语和技术水平有限,有不足的地方恳请各位指出.我会及时修正的 O(∩_∩)O 当前React版本 15.0.1 时间 2016/4/25 正文 React一个 ...
- 理解Go Context机制
1 什么是Context 最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也 ...
随机推荐
- IAR软件使用的快捷键配置以及配置cc2530环境
以下是我对IAR软件使用的快捷键配置cc2530以及配置环境的总结,如下图所示 弹出保存窗口 工程生成完毕——生成.c文件 快捷键ctrl+s保存.c文件 选择 ...
- webapck之多页面打包(常见)
webpack多入口打包 let path = require('path'); elt HtmlWebpackPlugin = require('html-webpack-plugin'); mod ...
- 负载均衡框架 ribbon 一
Ribbon开源地址:https://github.com/Netflix/ribbon/wiki/Getting-Started 1.Ribbon简介 负载均衡框架,支持可插拔式的负载均衡规则 支持 ...
- 转pdf
一.转印厂pdf(书本类及折页类) 1.储存为(Ctrl+Shift+S) 2.保存类型选择 pdf 3.常规==>Adobe PDF预设==>选择印刷质量 4.选择标记和出血==&g ...
- go结构体继承组合和匿名字段
1.结构体方法 go不是纯粹的面向对象的,在go里面函数是一等公民,但是go也有结构体实现类似java一样类的功能来提供抽象.结构体的方法分为值方法和指针方法,前者在方法中做的改变不会改变调用的实例对 ...
- 内网渗透之权限维持 - MSF
年初九 天公生 0x034 MSF(美少妇) 启动msf msfconsole 先启动msf依赖的postgresql数据库 初始化数据库 msfdb init (要用普通用户) msf路径 /usr ...
- 操作系统-schedule函数
1. Linux 0.11的调度函数schedule() 也就是找到了counter最大的进程,然后就跳出去执行switch_to,对应上面的优先级算法,而counter本身也是时间片,也作了轮转调度 ...
- Python基础编程题100列目录
实例001:数字组合 实例002:"个税计算" 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 实例007:copy 实例008:九 ...
- ASP.net MVC 构建layui管理后台(整体效果)
登录页: 首页 模块管理 角色管理,角色分配 用户管理
- [置顶] Django-rest framework框架
出师表 先帝创业未半而中道崩殂,今天下三分,益州疲弊此诚危急存亡之秋也.然侍卫之臣不懈于内忠志之士忘身于外者盖追先帝之殊遇,欲报之于陛下也.诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻 ...