[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接口,公司不少同事都不了解这样设计的出发点是什么,其实我也 ...
随机推荐
- 沙雕与大婶 | Mock调你的外部依赖吧
故事背景: 沙雕在公司负责API项目的开发,很认真负责,经常加班加点赶进度,却常常被老板吐槽说他开发效率太低,他自己也很委屈,因为他所负责的项目常常依赖大量外部系统,他只好等对方开发完才一个个对接,开 ...
- [Python之路] object类中的特殊方法
一.object类的源码 python版本:3.8 class object: """ The most base type """ # d ...
- Hexo站点Next主题添加google adsense广告
本文转载自: https://www.93bok.com 前言 无意之间看到了google adsense的广告,于是就想到给我的站点也弄一个,本来以为是很简单的事,参考了很多资料,终于是部署成功了, ...
- idea 2018.1激活方法
之前用的idea都是2017版本的,现在已经四月份了,对于2018年1月份的版本应该可以放心的用了. 在这里,仅提供2018版本的激活码. 至于安装步骤,这里省略一千个字...... 下面是具体的激活 ...
- 使用PHP语言制作具有加减乘除取余功能的简单计算器
准备工作: 使用环境 :PHPStudy 开启Apache和Mysql 打开代码编辑器 <!DOCTYPE html> <html lang="en"> & ...
- 安装docker,docker-compose,Harbor
一.docker安装 1.删除旧版本和相关依赖 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ d ...
- python使用for循环打印9*9乘法表。
代码如下: for a in range(1, 10): for b in range(1, 10): if b <= a: print("%d*%d=%d\t" % (b, ...
- flask 模型一对多个人理解
在modle中创建两个模型表 class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) ...
- vue基础 ref的作用
1. ref 获取dom元素,除了能获取dom元素也能获取组件dom, 组件通信: 在父组件中直接调用ref定义的组件的数据或者方法 <div id="app&qu ...
- Ng-Matero V9 正式发布!
距离 Ng-Matero 第一版发布已经过去了半年多,该项目获得了越来越多的关注及喜爱,甚至得到了外国友人的赞助.借此项目也认识了很多对 Angular 和 Material 感兴趣的朋友,如今对项目 ...