在一个典型的 React 应用中,数据是通过 props 属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的,这些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。
把参数传递到组件树的底层。
<div id="root" ></div>
<script type="text/babel">
class App extends React.Component {render() {return <Toolbar theme="dark" />;}
}
function Toolbar(props) {// Toolbar 组件接受一个额外的“theme”属性,然后传递给 ThemedButton 组件。// 如果应用中每一个单独的按钮都需要知道 theme 的值,这会是件很麻烦的事,// 因为必须将这个值层层传递所有组件。return (<div><ThemedButton theme={props.theme} /></div>);
}
class ThemedButton extends React.Component {render() {return <button>theme:{this.props.theme}</button>}
}ReactDOM.render(<App />,document.getElementById('root'));
</script>使用 context, 我们可以避免通过中间元素传递 props<script type="text/babel">
// Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。
// 为当前的 theme 创建一个 context(“light”为默认值)。
const ThemeContext = React.createContext('light');
class App extends React.Component {render() {// 使用一个 Provider 来将当前的 theme 传递给以下的组件树。// 无论多深,任何组件都能读取这个值。// 在这个例子中,我们将 “dark” 作为当前的值传递下去。return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);}
}
// 中间的组件再也不必指明往下传递 theme 了。
function Toolbar(props) {return (<div><ThemedButton /></div>);
}
class ThemedButton extends React.Component {// 指定 contextType 读取当前的 theme context。// React 会往上找到最近的 theme Provider,然后使用它的值。// 在这个例子中,当前的 theme 值为 “dark”。// static contextType = ThemeContext;render() {return (<ThemeContext.Consumer>{x => <h1>BatteryX : {x}</h1>}</ThemeContext.Consumer>);}
}ReactDOM.render(<App />,document.getElementById('root')
);</script>相关API:React.createContext
const ThemeContext = React.createContext('defaultValue');
创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。只有当组件所处的树中没有匹配到 Provider 时,其 defaultValue 参数才会生效。这有助于在不使用 Provider 包装组件的情况下对组件进行测试。注意:将 undefined 传递给 Provider 时,消费组件的 defaultValue 不会生效。Context.Provider
<MyContext.Provider value={/* 某个值 */}>
每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。Provider 接收一个 value属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。当 Provider 的value值发生变化时,它内部的所有消费组件都会重新渲染。Provider 及其内部 consumer 组件都不受制于shouldComponentUpdate函数,因此当 consumer 组件在其祖先组件退出更新的情况下也能更新。Context.Consumer
<MyContext.Consumer>
{value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>
这里,React 组件也可以订阅到 context 变更。这能让你在函数式组件中完成订阅 context。
这需要函数作为子元素(function as a child)这种做法。这个函数接收当前的 context 值,返回一个 React 节点。传递给函数的value值等同于往上组件树离这个 context 最近的 Provider 提供的value值。如果没有对应的 Provider,value参数等同于传递给createContext() 的 defaultValue。
更详细的文档
https://react-1251415695.cos-website.ap-chengdu.myqcloud.com/docs/context.html

React-Context相关推荐

  1. react context_使用React Context API-入门

    react context Let's use the React Context API to change theme in an app! 让我们使用React Context API更改应用程 ...

  2. gatsby_与Gatsby一起使用React Context API

    gatsby I'm a bit late to the party using the new React Context API, I did get to use it the other da ...

  3. 使用react的好处_聊一聊我对 React Context 的理解以及应用

    前言 Context被翻译为上下文,在编程领域,这是一个经常会接触到的概念,React中也有. 在React的官方文档中,Context被归类为高级部分(Advanced),属于React的高级API ...

  4. react源码分析:深度理解React.Context

    开篇 在 React 中提供了一种「数据管理」机制:React.context,大家可能对它比较陌生,日常开发直接使用它的场景也并不多. 但提起 react-redux 通过 Provider 将 s ...

  5. 10分钟学会React Context API

    Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单. 在小项目里Context API完全可以替换掉react-redux. 修改app.js import React ...

  6. React系列——React Context

    前言 我们先看一下React中,父子组件通信的机制,父子组件的通信是通过props进行数据的传递: 1.父组件向子组件传递数据(状态)时,是在调用子组件的时候通过参数传递给子组件,子组件通过this. ...

  7. React Context源码是怎么实现的呢

    目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api.大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(react-redux). 想想项 ...

  8. React 源码系列 | React Context 详解

    目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api.大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(react-redux). 想想项 ...

  9. React——context越级传值

    我们都知道,在React中数据可以以流的形式自上而下的传递,当你使用组件的时候,你可以看到组件的props属性会自上而下传递.但是在有些情况下不想通过父组件的props属性一级一级的向下传递,而是希望 ...

  10. React Context 原理理解

    文章目录 Context Context 相关用法 Context 原理 总结 Context React提供了 Context 上下文模式,为了解决 props 每层都需要传递的问题,即Contex ...

最新文章

  1. Lancet:支持奋战在疫情一线的中国科研技术工作者
  2. mysql ignore index_mysql use index、ignore index、force index用法
  3. java 指针_java多线程学习二十二:::java中的指针
  4. Ajax 实现无刷新分页
  5. 防重 Token 令牌如何实现幂等性?
  6. 河北省高校计算机大赛,河北省教育厅关于举办2016年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛的通知...
  7. 为什么腾讯视频下载不了_腾讯视频如何设置背景
  8. 深度学习笔记(11) 超参数调试
  9. Ansible Synopsis
  10. centos8 开启ftp服务
  11. P3194 [HNOI2008]水平可见直线
  12. html有多少种居中方式,html常用的几种居中方法
  13. 存在隐患 : 此角色的 日志目录 所在的文件系统的可用空间小于 10.0 吉字节。 /var/log/hive(可用:9.9 吉字节 (28.12%),容量:35.1 吉字节)
  14. Python语言程序设计 测验6: 组合数据类型 (第3周)
  15. 解决小程序view之间默认的空隙
  16. 2019年51CTO学院发布课程回顾总结-引莫(孙忠)
  17. 怎样在表格中选出同一类_excel表格怎么将相同内容筛选出来
  18. 初学VUE.js之数据绑定
  19. 什么是MES系统,实施难度大不大?
  20. 基于cesium的地形开挖地形剖切

热门文章

  1. Linux下Sniffer程序的实现
  2. Linux常用系统管理命令(top、free、kill、df)
  3. 《Elasticsearch in Action》书评与作者访谈
  4. 2012_01_26
  5. 分享--关于学习的一些事儿
  6. DrawerLayoutDemo【侧边栏(侧滑菜单)简单实现】
  7. 性能测试07:服务器性能测试范围
  8. NOIP2006提高组 能量项链
  9. Java程序设计专题
  10. 使用C语言来实现模块化