博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React中的“虫洞”——Context
阅读量:6507 次
发布时间:2019-06-24

本文共 1737 字,大约阅读时间需要 5 分钟。

当我们写React时,我们总是通过改变State和传递Prop对view进行控制,有时,也会遇到一点小麻烦。

背景

但是随着我们的应用变的越来越复杂,组件嵌套也变的越来越深,有时甚至要从最外层将一个数据一直传递到最里层(比如当前user的信息)。

理论上,通过prop一层层传递下去当然是没问题的。不过这也太麻烦啦,要是能在最外层和最里层之间开一个穿越空间的虫洞就好了。

幸运的是,React的开发者也意识到这个问题,为我们开发出了这个空间穿越通道 —— Context。

使用

看起来很高大上的Context使用起来却异常简单。

基本使用

假设我们有下面这样的组件结构。

clipboard.png

D组件需要获取在A组件中用户信息应该怎么办?有了Context,我们可以这么做。

// Component Aclass A extends React.Component {// add the following method  getChildContext() {    return {      user: this.props.user    }  }    render() {    return 
{this.props.children}
}}// add the following propertyA.childContextTypes = { user: React.PropTypes.object.isRequired}// Component Dclass D extends React.Component { render() { return
{this.context.user.name}
}}// add the following propertyD.contextTypes = { user: React.PropTypes.object.isRequired}

很简单吧,只要在外层定义一个getChildContext方法,在父层和里层分别制定contextTypes就可以直接在里层用this.context访问了,是不是很厉害,XD

在lifecycle方法中使用

根据官方的文档,Context在以下的lifecycle方法中也是可以使用的

void componentWillReceiveProps(  object nextProps, object nextContext)boolean shouldComponentUpdate(  object nextProps, object nextState, object nextContext)void componentWillUpdate(  object nextProps, object nextState, object nextContext)void componentDidUpdate(  object prevProps, object prevState, object prevContext)

stateless组件中使用

同时,在最新的stateless组件中,也是可以使用Context的,而且更加简单。

function D(props, context) {  return (    
{this.context.user.name}
);}D.contextTypes = { user: React.PropTypes.object.isRequired}

使用场景

既然Context使用起来如此方便,是不是就应该多多用它呢?

显然,抛开Context还处于刚刚公开,API不稳定不说,即使对于组件化的开发,到处用也不是一个好主意。
Context就像javascript中的全局变量,只有真正全局的东西才适合放在context中。

比如:

  • 当前用户信息
  • flux、redux的store
  • session级别信息(语言,主题等)

所以,当发现使用Context仅仅为了少打几个字而不考虑存放何种数据,那很可能用错Context了……

转载地址:http://iizfo.baihongyu.com/

你可能感兴趣的文章
《Python数据科学实践指南》一2.2 字符串
查看>>
《R数据可视化手册》——1.1 安装包
查看>>
《iOS创意程序设计家》——导读
查看>>
spring-aop
查看>>
android RecycleView Adapter简单封装
查看>>
PgSQL · 案例分享 · 递归收敛优化
查看>>
Dart的数据库操作
查看>>
Codeforces 591 B Rebranding【Codeforces Round #327 (Div. 2)】
查看>>
命名难,难于上青天
查看>>
做完和做好不一样
查看>>
APUE读书笔记-05标准输入输出库(7)
查看>>
23 第一周作业
查看>>
DNS解析偶尔延迟
查看>>
iOS打电话,发短信,发邮件,打开网址
查看>>
06-验证码-基本功能实现
查看>>
Java数据结构与算法(六) 希尔排序
查看>>
canvas学习笔记
查看>>
IntelliJ Idea下Go项目开启Debug调试
查看>>
elasticsearch安装步骤
查看>>
PHP获取Cookie模拟登录CURL(转)
查看>>