在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. 压力测试(六)-阿里云Linux服务器压测接口实战

    1.SpringBoot 接口打包,并用jar包方式部署 简介:用jar包方式在控制台进行启动 打包 mvn package && java -jar target/gs-spring ...

  2. tomcat服务器和http协议笔试题

    tomcat与web程序结构与Http协议与HttpUrlConnection 考查的知识点:tomcat服务器相关信息 1.下面关于tomcat服务器描述正确的是() (难度A) A. tomcat ...

  3. session和el表达式

    2015/1/21 ## 回顾昨天案例 ## # 模拟购物车: >> 基本步骤: |-- 显示所有的书籍: |-- 制作书记列表/模仿数据库: |-- 参见昨天示例: |-- 制作查看详情 ...

  4. 7-10 jmu-python-异常-学生成绩处理基本版 (15 分)

    小明在帮老师处理数据,这些数据的第一行是n,代表有n行整数成绩需要统计.数据没有错误,则计算平均值(保留2位小数)并输出.数据有错误,直接停止处理,并且不进行计算. 注:该程序可以适当处理小错误,比如 ...

  5. Java - 常见的算法

    二分法查找 private static int binarySearch(int[] list,int target) { ; ; //直到low>high时还没找到关键字就结束查找,返回-1 ...

  6. Azure Devops/TFS测试管理(下)

    紧接着 上篇 经过上篇折腾,我们已经有了: ①手工测试的流程规范 ②测试用例的管理 对于开发出身的我,我觉得一个项目上线流程应该主要瓶颈只能是开发本身,因为我认为最复杂过程应该就是开发,而肯定不能是测 ...

  7. canvas初尝试

    最近学习了canvas,就拿它做了这么个小东西,感觉已经爱上canvas了.上代码 /* * @auhor : 开发部-前端组-李鑫超 * @property { tableData : {Array ...

  8. Spring Cloud Feign 优雅的服务调用

    Fegin 是由NetFlix开发的声明式.模板化HTTP客户端,可用于SpringCloud 的服务调用.提供了一套更优雅.便捷的HTTP调用API,并且SpringCloud整合了Fegin.Eu ...

  9. @常见的远程服务器连接工具:Xshell与secureCRT的比较!!!(对于刚接触的测试小白很有帮助哦)

    现在比较受欢迎的终端模拟器软件当属xshell和securecrt了. XShell绝对首选,免费版也没什么限制,随便改字体随便改颜色随便改大小随便改字符集,多窗口,也比较小巧,而SecureCRT界 ...

  10. seo搜索优化教程12-网站SEO诊断

    为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉信息科技强势推出seo搜索优化教程.此为seo教程第12课 行业分析 在搜索引擎中检索自己的站点,在检索结果及相关网站中分析自己在行业内的 ...