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

例子

  1. import React from 'react'
  2. const themes={
  3. light:"亮色主题",
  4. dark:"暗色主题"
  5. }
  6. const sexs={
  7. man:"男性",
  8. wem:"女性",
  9. }
  10. const SexContext=React.createContext(sexs.man);
  11. const ThemeContext=React.createContext(themes.dark);
  12. export default class Context extends React.Component {
  13. state={
  14. theme:themes.light,
  15. sex:sexs.wem,
  16. }
  17. render(){
  18. return(
  19. <div>
  20. <ThemeContext.Provider value={this.state.theme}>
  21. <ThemeSwitch />
  22. </ThemeContext.Provider>
  23. <SexContext.Provider value={this.state.sex}>
  24. <SexSwitch />
  25. </SexContext.Provider>
  26. </div>
  27. );
  28. }
  29. }
  30. class ThemeSwitch extends React.Component {
  31. render(){
  32. //let theme=this.context;
  33. return (
  34. <ThemeContext.Consumer>
  35. {value=><button>{value}</button>}
  36. </ThemeContext.Consumer>
  37. );
  38. }
  39. }
  40. class SexSwitch extends React.Component {
  41. render(){
  42. let sex=this.context;
  43. return (
  44. <button>
  45. {sex}
  46. </button>
  47. );
  48. }
  49. }
  50. SexSwitch.contextType=SexContext;

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

API

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

React.createContext

作用:创建Context对象

用法:

  1. const MyContext = React.createContext(defaultValue);

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

Context.Provider

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

用法:

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

Class.contextType

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

用法:

  1. MyClass.contextType = MyContext;

MyClass为Cousumer所在的组件。

Context.Consumer

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

用法:

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

value即为Provider的value属性

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

例子的解读

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

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

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

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

最后的效果:



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

补充后代码如下:

  1. import React from 'react'
  2. const themes={
  3. light:"亮色主题",
  4. dark:"暗色主题"
  5. }
  6. const sexs={
  7. man:"男性",
  8. wem:"女性",
  9. }
  10. const SexContext=React.createContext(sexs.man);
  11. const ThemeContext=React.createContext(themes.dark);
  12. export default class Context extends React.Component {
  13. state={
  14. theme:themes.light,
  15. sex:sexs.wem,
  16. }
  17. handleSwitch=()=>{
  18. let sex=this.state.sex;
  19. let theme=this.state.theme;
  20. this.setState({
  21. sex:sex==sexs.man?sexs.wem:sexs.man,
  22. theme:theme==themes.dark?themes.light:themes.dark,
  23. })
  24. }
  25. render(){
  26. return(
  27. <div>
  28. <ThemeContext.Provider value={this.state.theme}>
  29. <ThemeSwitch />
  30. </ThemeContext.Provider>
  31. <SexContext.Provider value={this.state.sex}>
  32. <SexSwitch />
  33. </SexContext.Provider>
  34. <button onClick={this.handleSwitch}>切换</button>
  35. </div>
  36. );
  37. }
  38. }
  39. class ThemeSwitch extends React.Component {
  40. render(){
  41. //let theme=this.context;
  42. return (
  43. <ThemeContext.Consumer>
  44. {value=><button>{value}</button>}
  45. </ThemeContext.Consumer>
  46. );
  47. }
  48. }
  49. class SexSwitch extends React.Component {
  50. render(){
  51. let sex=this.context;
  52. return (
  53. <button>
  54. {sex}
  55. </button>
  56. );
  57. }
  58. }
  59. 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. git指令-删除

    git指令-删除 添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test.txt" [maste ...

  2. Python3——2019年全国大学生计算二级考试

    Python语言程序设计二级重点(2019年版) 第一章 程序设计基本方法 IPO程序编写方法 :输入(input),输出(output),处理(process): Python程序的特点: (1)语 ...

  3. 《OneForAll框架搭建之旅》前端篇:微前端架构设计(Vue)

    心之所向,勇往直前!记录开发过程中的那些小事,给自己加点经验值. 前言 作为一个.Net后端开发,在竞争愈加激烈的当下,掌握点前端配菜好像已经是家常便饭了. 刚好在工作的第5个年头,辞去小主管职务的我 ...

  4. 【JavaScript】DOM之表单操作

    DOM 表单操作 1.获取表单 获取表单元素 以Document对象中forms属性来获取当前HTML页面所有表单集合以Document对象中表单的name属性值来获取表单元元素 <body&g ...

  5. 必备技能六、Vue中实现全局方法

    现实背景:很多时候我们会在全局调用一些方法. 实现方式两种:官网的实现use方法,然后你也可以用野路子直接在Vue.prototype上面定义. 先说野路子,因为其实野路子就是最根本的实现方式,官方的 ...

  6. 如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李

    前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...

  7. 「踩坑记」Android API 判断权限申请结果的闪退问题

    这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...

  8. JAVA多线程面试必看(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  9. 深度学习归一化:BN、GN与FRN

    在深度学习中,使用归一化层成为了很多网络的标配.最近,研究了不同的归一化层,如BN,GN和FRN.接下来,介绍一下这三种归一化算法. BN层 BN层是由谷歌提出的,其相关论文为<Batch No ...

  10. 通达OA rce复现

    通达OA下载:链接:https://pan.baidu.com/s/1c0P-M-IyY5VxfH5d0qKHsQ 提取码:l0pc 漏洞原因:未授权文件上传 + 文件包含(利用nginx日志也可以g ...