层层传递Props

  • 单向数据流层层传递,繁琐不好管理。

Context

  • 什么是context?

context是react提供的组件通信api

  • context有什么用?

解决{组件.js}中多层级组件通信,参数层层传递的麻烦。

import React, { Component } from 'react';
import PropTypes from 'prop-types'; const Inner1 = (props) => {
return (
<div style={{ border: '2px solid green' }}>
<p>Inner1纯组件</p>
<Inner2></Inner2>
</div>
)
} const Inner2 = (props,context) => {
return (
<div style={{ border: '2px solid red' }}>
<p>Inner2纯组件</p>
<p>{context.color}</p>
</div>
)
}
Inner2.contextTypes = {
color: PropTypes.string
} class Top1 extends Component {
getChildContext() {
return { color: 'red' };
}
render() {
return (
<div>
<Inner1></Inner1>
</div>
);
}
} Top1.childContextTypes = {
color: PropTypes.string
}
export default Top1;
context 使用注意事项
  • 1-1 context 提供者(组件)中需定义getChildContext方法ruturn一个对象,对象中包含发布的信息。
  • 1-2context 提供者需定义 组件名.childContextTypes内容类型
  • 2-1访问者需定义 组件名.contextTypes内容类型
  • 2-2传参中添加context,以{context.属性}方式使用

    https://juejin.im/post/5a90e0545188257a63112977

createContext

引用官方文档:


The problem is, if a context value provided by component changes, descendants that use that value won’t update if an intermediate parent returns false from shouldComponentUpdate. This is totally out of control of the components using context, so there’s basically no way to reliably update the context.

简单说,就是如果context的值有更新时,没办法保证所有子节点一定能更新。


为什么?因为在老的Context中由上而下的“触发链”有可能被shouldComponentUpdate打断。

https://zhuanlan.zhihu.com/p/34038469

React.createContext() 此API会返回一个组件。

const Context = React.createContext();

使用这个组件中的静态Provider组件包裹子组件并发布消息。

<Context.Provider value={this.getContext()}>
<LoginFormWith />
</Context.Provider>

子组件通过静态Consumer来消费信息。

<Context.Consumer>
{(context) => (
<div>{JSON.stringiy(context)}</div>
)}
</Context.Consumer>

不过使用高阶函数来装载context更优雅

https://gitee.com/n3taway/tabs_component_packaging

react 共享数据流的更多相关文章

  1. 深入理解React(二) —— 数据流和事件原理

    版权声明:本文由左明原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/158 来源:腾云阁 https://www.qclou ...

  2. 【JAVASCRIPT】React学习- 数据流(组件通信)

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...

  3. React——共享state

    通常,一些组件需要反映相同的数据更改,这种情况推荐将共享state移动到它们最近的公共祖先上. 在这里有一个例子:有一个温度计算器计算在给定温度是否能让水沸腾,用户可以输入华氏温度也能输入摄氏温度,当 ...

  4. react单向数据流怎么理解?

    React是单向数据流,数据主要从父节点传递到子节点(通过props).如果顶层(父级)的某个props改变了,React会重渲染所有的子节点.

  5. react实战 系列 —— React 的数据流和生命周期

    其他章节请看: react实战 系列 数据流和生命周期 如何处理 React 中的数据,组件之间如何通信,数据在 React 中如何流动? 常用的 React 生命周期方法以及开源项目 spug 中使 ...

  6. React数据流和组件间的沟通总结

    今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...

  7. React 精要面试题讲解(一) 单向数据流

    react 单向数据流概念 'react框架是怎样的数据流向?'||'react单向数据流是怎样的概念 ?' 解答这个问题之前,我们首先得知道,js框架是个怎样的概念. 框架:具备一定**编程思想** ...

  8. React数据流和组件间的通信总结

    今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...

  9. React的单向数据流与组件间的沟通

    今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...

随机推荐

  1. Focal Loss 的前向与后向公式推导

    把Focal Loss的前向和后向进行数学化描述.本文的公式可能数学公式比较多.本文尽量采用分解的方式一步一步的推倒.达到能易懂的目的. Focal Loss 前向计算 其中 是输入的数据 是输入的标 ...

  2. java ListNode链表数据结构

    class ListNode{ int val; ListNode next; } 该节点的值 val.   下一个节点  next

  3. Mac下配置Java Web开发环境(Mac 10.12)

    1.JDK http://www.cnblogs.com/EasonJim/p/6277541.html 2.MySQL http://www.cnblogs.com/EasonJim/p/62758 ...

  4. sql中COUNT(*)、COUNT(字段名)的区别

    数据表:其中IT002的Fname是null. 执行sql: ) FROM T_Employee 结果: 结论:COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中 ...

  5. Python DataFrame导出CSV、数据库

    写入Oracle from sqlalchemy import create_engine import pandas as pd import numpy as np df = pd.DataFra ...

  6. i.mx6 Android6.0.1分析input子系统:测试

    getevent与sendevent工具 Android系统提供了getevent与sendevent两个工具供开发者从设备节点中直接读取输入事件或写入输入事件. 在这里,我们测试音量加和音量减按键 ...

  7. c#删除list中的元素

    public static void TestRemove() { string[] str = { "1", "2", "d", &quo ...

  8. Spring.Net---1、IOC第一个实例

    Spring.NET IoC容器的用法. 通过简单的例子学习Spring.Net 1.先创建一个控制台程序项目. 2.添加IUserInfoDal 接口. namespace Spring.Net { ...

  9. js只允许输入数字和两位小数

    一.js只允许输入数字和两位小数 //只允许输入数字和两位小数 function clearNoNum(obj) { obj.value = obj.value.replace(/[^\d.]/g, ...

  10. [javaSE] 标识符大小写

    java中是严格区分大小写的. PHP中函数,类名称不区分大小写,变量和常量区分大小写 public class VariableDemo { public static void test(){ S ...