在之前react的工程项目中,关于数据流动以及父子组件中数据通信大都是通过react-redux、redux来完成,虽然可以解决问题,但是这种数据管理是较为复杂的,在最新的react16.3中推出了Context API,降低了开发的复杂度。 下面通过代码来进行详细的分析 首先创建一个context的实例

import React from 'react';
import { render } from "react-dom";
const GlobalContext = React.createContext('dark');
复制代码

生成的context对象具有两个组件类对象

{Provider: React.ComponentType<{value: T}>,Consumer: React.ComponentType<{children: (value: T)=> React.ReactNode}>
}
复制代码

接下来创建Provider对象,该对象类似react-redux中的Provide对象

class GlobalContextProvider extends React.Component {// 类似redux中的初始化状态state = {theme: 'dark'};// 类似reducerhandleContextChange = action => {switch (action.type) {case "UPDATE_THEME":return this.setState({theme: action.theme});default:return;}};render() {return (<GlobalContext.Providervalue={{dispatch: this.handleContextChange,theme: this.state.theme}}>{this.props.children}</GlobalContext.Provider>);}
}
复制代码

接下来定义一个组件来改变state

const SubComponent = props => (<div>{/* 类似action,触发后改变状态 */}<buttononClick={() =>props.dispatch({type: "UPDATE_THEME",theme: "light"})}>change theme</button><div>{props.theme}</div></div>
);
复制代码

最后利用到上述提到的Consumer对象加载状态并挂载到dom节点上

class App extends React.Component {render() {return (<GlobalContextProvider><GlobalContext.Consumer>{context => (<SubComponenttheme={context.theme}dispatch={context.dispatch}/>)}</GlobalContext.Consumer></GlobalContextProvider>);}
}render(<App />, document.getElementById("root"));
复制代码

那么是不是就是可以利用新的API来代替redux呢?答案当然是否定的 我们可以看到上述的使用Context的方式与redux很类似,因此如果很复杂的应用这样的写法无异于使代码复杂混乱,因此可以这样进行选择:

  1. 注入式的组件,类似背景、语言这种控制全局的变量,可以选择这种
  2. 对于那些复杂的数据交互,父子组件通信还是选择redux

参考文章

  1. React's new Context API

  2. 从新的 Context API 看 React 应用设计模式

React中Context API的应用相关推荐

  1. React 中 Context 和 contextType的使用

    React 中 Context 的使用 context Context 提供了一种方式,能够让数据在组件树中传递时不必一级一级的手动传递 一般情况下,数据在组件中,要一级一级的传递,单向数据流,比如P ...

  2. React 新 Context API 在前端状态管理的实践

    2019独角兽企业重金招聘Python工程师标准>>> 本文转载至:今日头条技术博客 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较 ...

  3. 创建react应用程序_通过创建食谱应用程序来学习在React中使用API

    创建react应用程序 Learn how to use external APIs with React and React Router in a full tutorial from Hamza ...

  4. react中context到底是如何传递的-源码分析

    react中使用context 基本要求就是 父组件中声明Parent.prototype.getChildContext 父组件中声明Parent.childContextType 子组件声明 Ch ...

  5. React中Context的使用

    一.概述 Context 提供了一种在组件之间共享值的方式,而不必显式地通过组件树的逐层传递 props.如果获取值和使用值的层级相隔很远,或者需要使用这个值的组件很多很分散,则可以使用Context ...

  6. react调用api等待返回结果_React新Context API在前端状态管理的实践

    ### React新Context API在前端状态管理的实践 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redu ...

  7. this指向、数据双向流、传递参数、JSX中循环、React中样式、路由、引入资源的其它方式、create-react-app脚手架、事件处理、获取数据、UI框架推荐、pc桌面应用electronjs

    改变this指向的几种方式: //1.使用箭头函数代替原始函数写法:getState=()=>{}//2.在函数调用时给函数名加bind(this)方法:(bind中第一个参数表示修改this指 ...

  8. React中的组件通信——父传子、子传父、Context

    0.认识组件间的通信 在开发过程中,我们会经常遇到需要组件之间相互进行通信: 比如App可能使用了多个Header,每个地方的Header展示的内容不同,那么我们就需要使用者传递给Header一些数据 ...

  9. react hooks使用_如何使用React Hooks和Context API构建简单的PokémonWeb App

    react hooks使用 After seven years of full stack development using Ruby, Python, and vanilla JavaScript ...

最新文章

  1. 终于有人把Python讲清楚了!
  2. Remoting學習(五)----Reomoting 事件和配置文件的疑惑
  3. e 签宝携手神策数据,数据赋能智能办公产品服务双升级
  4. 一阶rc电路时间常数_波形产生电路中的RC在电路中的作用是什么
  5. C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)
  6. 【征稿通知】CCF第37届中国计算机应用大会 CCF NCCA 2022
  7. Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理
  8. Socket编程入门
  9. 取消button的点击效果_(Vue动效)6.Vue中列表过渡效果
  10. C# DataTable.Rows.Add(DataRow) 该行已经属于另一个表
  11. Linux SMB和NFS文件共享
  12. java 协同编辑的多指针_多人协作项目如何保持代码风格统一
  13. VS通过opencv显示图片和打开相机的显示生成dll用unity调用
  14. c语言程序设计设计题题库,C语言程序设计题库.doc
  15. java中模糊查询sql怎么写_java模糊查询sql语句
  16. IDEA git 切换分支产生问题
  17. 小米发布会的米8探索者——很吓人的技术分析
  18. JAVA之假克隆、浅克隆、深克隆
  19. 深入学术研究,物理学家用VR演示弦理论猜想
  20. vue 中面包屑带跳转的做法

热门文章

  1. Maven的pom文件那些事
  2. 在 Java 中应用设计模式 - Factory Method
  3. 编码练习——Java-7-集合类
  4. javaweb学习总结(三十一)——国际化(i18n)
  5. 如何创建并运行java线程
  6. Windows下Eclipse+PyDev安装Python开发环境
  7. 如何与人交流——程序员,赶紧生个孩子吧!
  8. C安全编码--预处理
  9. 机器学习入门资源不完全汇总
  10. C++运算符重载(友元函数方式)