react 共享数据流
层层传递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 共享数据流的更多相关文章
- 深入理解React(二) —— 数据流和事件原理
版权声明:本文由左明原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/158 来源:腾云阁 https://www.qclou ...
- 【JAVASCRIPT】React学习- 数据流(组件通信)
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...
- React——共享state
通常,一些组件需要反映相同的数据更改,这种情况推荐将共享state移动到它们最近的公共祖先上. 在这里有一个例子:有一个温度计算器计算在给定温度是否能让水沸腾,用户可以输入华氏温度也能输入摄氏温度,当 ...
- react单向数据流怎么理解?
React是单向数据流,数据主要从父节点传递到子节点(通过props).如果顶层(父级)的某个props改变了,React会重渲染所有的子节点.
- react实战 系列 —— React 的数据流和生命周期
其他章节请看: react实战 系列 数据流和生命周期 如何处理 React 中的数据,组件之间如何通信,数据在 React 中如何流动? 常用的 React 生命周期方法以及开源项目 spug 中使 ...
- React数据流和组件间的沟通总结
今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...
- React 精要面试题讲解(一) 单向数据流
react 单向数据流概念 'react框架是怎样的数据流向?'||'react单向数据流是怎样的概念 ?' 解答这个问题之前,我们首先得知道,js框架是个怎样的概念. 框架:具备一定**编程思想** ...
- React数据流和组件间的通信总结
今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...
- React的单向数据流与组件间的沟通
今天来给大家总结下React的单向数据流与组件间的沟通. 首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则. 先介绍单向数据流吧. React单向数据流: React是单向数 ...
随机推荐
- linux C API连接并查询mysql5.7.9
开发环境: ubuntu16.04 mysql5.7.9 原生C API VIM 配置远程连接 配置mysql允许远程连接的方法默认情况下,mysql只允许本地登录,如果要开启远程连接,则需要修改/e ...
- CF1139D Steps to One 题解【莫比乌斯反演】【枚举】【DP】
反演套 DP 的好题(不用反演貌似也能做 Description Vivek initially has an empty array \(a\) and some integer constant ...
- SVN无法读取cruuent修复方法
解决方法:在网上百度和google了一大圈之后,终于得知是断电时current和txn-current文件没有写入当前最新版本号和最新版本的路径问题 当时非常抓狂,项目刷新一直为空. 1.先把curr ...
- Hibernate中Query.list()方法报IllegalArgumentException异常
最近在使用Hibernate开发项目,在写好hql语句,并初始化Query对象,执行Query.list()方法时,应用报IllegalArgumentException异常.经网上查询,现已经基本决 ...
- ubuntu手动安装PhantomJS
1.切换到主目录:cd ~2.下载安装包:https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-Linux-x86_64.ta ...
- PHP之string之str_shuffle()函数使用
str_shuffle (PHP 4 >= 4.3.0, PHP 5, PHP 7) str_shuffle - Randomly shuffles a string str_shuffle - ...
- java的finally简单理解
1. 大家都知道, 普通的try, catch, finally格式: try{ //有可能会抛出异常的代码 }catch{ //抛出异常时处理的代码 }finally{ //无条件执行的代码,就不管 ...
- 如何用webgl(three.js)搭建不规则建筑模型,客流量热力图模拟
本节课主要讲解如何用webgl(three.js)搭建一个建筑模型,客流量热力图模拟 使用技术说明: 这里主要用到了three.js,echart.js以及一些其它的js 与css技术,利用webso ...
- XmlDocument.LoadXml和Load的区别
LoadXml:从指定的字符串加载 XML 文档. eg:doc.LoadXml("<root>aa</root>"); .csharpcode, .csh ...
- JS中的 ES6新类型iterable
1.1 iterable字面意思:可迭代的,可重复的 iterable是ES6标准引入的新的类型.而Array.Map和Set都属于iterable类型 1.2 为什么加入iterable类型? 遍历 ...