[译]React Context
欢迎各位指导与讨论 : )
前言
由于笔者英语和技术水平有限,有不足的地方恳请各位指出。我会及时修正的 O(∩_∩)O 当前React版本 15.0.1 时间 2016/4/25
正文
React一个最大的优点是,我们非常容易跟踪React组件之间的数据流动。当我们观察一个组件的时候,我们能够容易、清晰地得知哪一些props正被传输。基于这一点,也使我们的代码易懂。但是也有一种情况,当我们想在组件树内部传递props,并且不想让props流经树的每一层,Context会让我们做到这一点。
注:Context是一个先进易变的特性,它的API很可能会在未来的版本里改动。
当然,绝大多数应用无需使用到Context。因为使用Context会我们的代码变得难懂,耦合度增强,复用性降低,同时也让组件间的数据流动变得不够清晰。Context就像我们在应用中使用全局变量一样。我们应当谨慎使用Context。下面是一个例子
var Button = React.createClass({
  contextTypes: {
    color: React.PropTypes.string
  },
  render: function() {
    return (
      <button style={{background: this.context.color}}>
        {this.props.children}
      </button>
    );
  }
});
var Message = React.createClass({
  render: function() {
    return (
      <div>
        {this.props.text} <Button>Delete</Button>
      </div>
    );
  }
});
var MessageList = React.createClass({
  childContextTypes: {
    color: React.PropTypes.string
  },
  getChildContext: function() {
    return {color: "purple"};
  },
  render: function() {
    var children = this.props.messages.map(function(message) {
      return <Message text={message.text} />;
    });
    return <div>{children}</div>;
  }
});
在这个例子中,通过向MessageList(context provider)增加 childContextTypes 和 getChildContext,React 能够自动地把信息(数据)向所有设置了 contextTypes 的子树进行传递。如果 contextTypes 在子组件中还没有定义,那 this.context将会是一个空对象。若 contextTypes 已经在子组件中定义好了,那在组件接下来的生命周期里将多增加一个参数: context对象
当一个无状态函数型的组件中定义好一个property并且设置好了 contextTypes ,那该函数也能够成功引用 context 对象
function Button(props, context) {
  return (
    <button style={{background: context.color}}>
      {props.children}
    </button>
  );
}
Button.contextTypes = {color: React.PropTypes.string};
那我们应该怎么更新组件的 Context 呢。答案是,把 Context 和组件的 State关联起来,当组件的state或者props改变的时候,getChildContext函数会自动调用,更新Context 并把这个新的Context和其他改变一起传输到子树。下面是一个例子
var MediaQuery = React.createClass({
  getInitialState: function(){
    return {type:'desktop'};
  },
  childContextTypes: {
    type: React.PropTypes.string
  },
  getChildContext: function() {
    return {type: this.state.type};
  },
  componentDidMount: function(){
    var checkMediaQuery = function(){
      var type = window.matchMedia("(min-width: 1025px)").matches ? 'desktop' : 'mobile';
      if (type !== this.state.type){
        this.setState({type:type});
      }
    };
    window.addEventListener('resize', checkMediaQuery);
    checkMediaQuery();
  },
  render: function(){
    return this.props.children;
  }
});
其实在大多数情况下,为了代码的清晰可观,我们都应该尽可能避免使用Context(就像全局变量一样)。Context的最佳应用情景应该是像用户登录、应用语言或者是应用主题的这一类情景,这些都是真实的全局变量。
建议不要使用Context在组件中传输我们的model data,之前的写法才会让代码简单易懂。
[译]React Context的更多相关文章
- 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 Context  API
		
使用React 开发程序的时候,组件中的数据共享是通过数据提升,变成父组件中的属性,然后再把属性向下传递给子组件来实现的.但当程序越来越复杂,需要共享的数据也越来越多,最后可能就把共享数据直接提升到最 ...
 - 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)
		
Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, 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 Api
		
随着 React 16.3.0 的发布,context api 也有了很大的更新.我已经从旧版的 api 更新到了新版.这里就分享一下我(作者)的心得体会. 回顾 下面是一个展示如何使用旧版 api ...
 - react context跨组件传递信息
		
从腾讯课堂看到的一则跨组件传递数据的方法,贴代码: 使用步骤: 1.在产生参数的最顶级组建中,使用childContextTypes静态属性来定义需要放入全局参数的类型 2.在父组件中,提供状态,管理 ...
 - React Context(一):隐式传递数据
		
一 Context概述 Context provides a way to pass data through the component tree without having to pass pr ...
 - react context toggleButton demo
		
//toggleButton demo: //code: //1.Appb.js: import React from 'react'; import {ThemeContext, themes} f ...
 
随机推荐
- 不明显的多线程编程的具体Bugs
			
我们都知道,在编写多线程程序时,我们应该记住很多细节,比如锁,使用线程安全库等.这里有一个不太明显的bug的列表,特定于多线程程序.其中许多都没有在初学者的文档或教程中提到,但我认为每个使用线程的人最 ...
 - http 缓存相关学习
			
在面试中被问到好多缓存的问题 200 cache cookies 304(304 和 200 cache的区别) cookies在什么时候创建 发送 等等 自己回答的并不是很好 这次仔细的学习 ...
 - xml与datatable类型互换
			
//已测 private DataTable ConvertXMLToDataSet(string xmlData) { StringReader stream = null; XmlTextRead ...
 - iOS下Audio自动播放(Autoplay)音乐
			
前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...
 - Microsoft Dynamics CRM 分销行业解决方案
			
Microsoft Dynamics CRM 分销行业解决方案 方案亮点 360度动态渠道信息管理 充分的客户细分 全面的业务代表考核指标 业务代表管理和能力建设 业务代表过程管理 业务代表费用管理 ...
 - 网站已迁移至:https://tasaid.com/
			
个人网站:http://tasaid.com/ 主要文章在 个人网站 更新,尽可能在博客园同步更新. github:https://github.com/linkFly6 或者可以参与到我目前正在开发 ...
 - FIJ Jobs - 150316
			
Department Vacancies Total Skill Set Experience Language Oracle; OBIEE 3years English Systems Sr. So ...
 - Sharepoint学习笔记—习题系列--70-576习题解析 -(Q99-Q101)
			
Question 99 You have designed a new SharePoint 2010 Web Part that was deployed to the testing envir ...
 - iOS UIPageViewController
			
UIPageViewController是App中常用的控制器.它提供了一种分页效果来显示其childController的View.用户可以通过手势像翻书一样切换页面.切换页面时看起来是连续的,但静 ...
 - iOS百度地图SDK集成详细步骤
			
1.iOS百度地图下载地址 http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 根据需要选择不同的版本 ...