组件间通信

React的基本组件元素是一个个组件,组件之间可能存在关联、组合等关系。不同的组件之间,经常会发生数据传递或者交换,我们称之为组件间通信。

根据传递的复杂程度,可以分为三种情况:

父子间通信,兄弟间通信,同其他外部库通信。

父子间通信

在学习组件的时候,props是输入,组件是输出。在这里的props,就是父向子传递的数据。而子向父传递数据,则是通过父级传递进来的props中的函数引用,间接的唤起父级处理函数,并传入参数。

/* 父组件 */
export default class NameInput extends Component {
constructor(props) {
super(props);
this.state = {
value: "default"
};
this.handleSubChange = this.handleSubChange.bind(this);
}
handleSubChange(newValue) {
this.setState({ value: newValue });
}
render() {
return (
<div>
<div>{this.state.value}</div>
<Sub sub="sub1" subClick={this.handleSubChange} />
</div>
);
}
}
/* 子组件 */
export default class NameInput extends Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange() {
this.props.subClick("new sub");
}
render() {
return <div onClick={this.handleChange}>{this.props.sub}</div>;
}
}

在这个例子里,通过调用props上传递进来的处理函数,达到了子向父传递数据的目的。

兄弟间通信

不使用其他库的话,借助React原生API,有两种方法:

  1. 通过父组件做中转
  2. 借用父组件以外,也可以使用react的Context API

关于Context API,我们还是先翻文档Context

Context主要是为了处理多个组件可能需要获取同一组数据,例如文档中提到的theme,以及B端系统经常需要获取全局登录态,都可以使用ContextAPI。

在Context中,有两个重要的概念,Provider和Consumer。

Provider提供一个全局的数据源,订阅了它的数据源的Cusumer,不论节点嵌套多深都可以获取到Provider提供的数据。

看一个例子。

点我-CodeSandbox

在一些轻量级的应用中,基本上可以使用ContextAPI解决多级数据共享的问题。当然,如果要更强大,只能用Redux等库了。

关于Redux的使用,会在下一篇详细讲解。

同其他外部库通信

如果一个项目中,既有React,又有jQuery,又有Vue怎么办?怎么解决这种情形下得数据流转?

这是阿里的一道面试题,我那时没有怎么写过React,基本上就是zepto和小程序,面试官没有为难我,提了这样的问题。当时我提出了一种想法,发布订阅加适配器模式。下面简单说一下我的想法。

如果把这个场景抽象一下,可以看做是三种不同的组件需要相互通信,它们对数据的要求不一样,数据格式不同,但是一旦数据打到各自的组件内,其实数据流就不需要我们关心了。

所以可以维护一个公共的数据集市,所有人都从数据集市里取数据,也向数据集市中发数据,数据集市是一个公开的发布者,各组件为订阅者。

数据集市承担了适配的工作,对各个组件传进来的数据统一保存,在取数据时,根据组件的类型不同,派发不同形式的组件,这样,基本上就将组件间通信提升至了一个统一的数据集市,避免了组件的之间一对一通信。

当然,这和flux的思想也很类似,统一数据源,统一分发,只和数据源交互,避免了多个组件间复杂通讯带来的数据流混乱。

不管怎么样,在前端应用越来越复杂的今天,数据流的流向问题是绕不开,不论是单向数据流,还是多Model多数据流,都是适配当前场景下的解决方案,以后可能会有新的解决方案。

但是目前,在React体系中,Redux是绕不开的。下一篇,说一下flux和Redux。

react系列(三)组件间通信的更多相关文章

  1. React 精要面试题讲解(二) 组件间通信详解

    单向数据流与组件间通信 上文我们已经讲述过,react 单向数据流的原理和简单模拟实现.结合上文中的代码,我们来进行这节面试题的讲解: react中的组件间通信. 那么,首先我们把看上文中的原生js代 ...

  2. React 组件间通信介绍

    React 组件间通信方式简介 React 组件间通信主要分为以下四种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面对这四种情况分别进行介绍:   父组件向子 ...

  3. [转] React 中组件间通信的几种方式

    在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面依次说下这几种通 ...

  4. React 组件间通信 总结

    组件间通信 5.1.1. 方式一: 通过props传递 1)         共同的数据放在父组件上, 特有的数据放在自己组件内部(state) 2)         通过props可以传递一般数据和 ...

  5. React独立组件间通信联动

    React是现在主流的高效的前端框架,其官方文档 http://reactjs.cn/react/docs/getting-started.html 在介绍组件间通信时只给出了父子组件间通信的方法,而 ...

  6. React的组件间通信

    一.React的单向数据流 React是单向数据流,数据主要从父节点传递到子节点(通过props).如果顶层(父级)的某个props改变了,React会重渲染所有的子节点.这通常被称为“自顶向下”或“ ...

  7. vue 和 react 组件间通信方法对比

    vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...

  8. React中父子组件间的通信问题

    1.https://blog.csdn.net/sinat_17775997/article/details/59103173 (React中父子组件间的通信问题)

  9. React Native组件间通信

    React Native组件间通信 React Native组件的关系有:父子关系.无直接关系.组件间通信主要针对这两类来讨论. 一.父组件和子组件之间通信 父组件向子组件传递消息.数据通过对子组件的 ...

随机推荐

  1. PL/SQL 快速连接数据库

    打开PL/SQL 登录窗口,在数据库地址写入 服务器名:端口号/sid 即可, 例如: 192.168.100.100:1521/test

  2. SQL Server UDF to pad a string

    http://www.mssqltips.com/sqlservertip/1738/sql-server-udf-to-pad-a-string/ declare @l varchar(50) se ...

  3. The method setItems(String) in the type ForTokensTag is not applicable for the arguments (Object)

    1. 问题 看到这个错误以为是貌似jsp页面有误,c:forTokens标签用错了?? An error occurred at line: in the jsp file: /WEB-INF/pag ...

  4. Hello Activemq

    0. 如果永远是localhost 可能一直low下去 1.下载安装 activemq 1.1 从官网下载activemq.tar.gz 并上传(rz)到linux系统 并解压 tar zxvf /* ...

  5. ubuntu终端颜色设置

    在 .bashrc中增加 PS1='${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u @ \h\[\033[00m\]:\[\033[00;34m ...

  6. <head>标签和它的小伙伴们

    head标签是HTML文档中最基本的必须元素之一(body:对,还有我): <html> <head> <title>文档的标题</title> < ...

  7. idea 出现 java.noSuchMechodFound

    公司 用了多个项目来相互之间形成依赖.每次修改或者添加新功能,会升级版本.用的是maven,这几天 一直 出现一个问题就是:本地 升级版本完后 使用 git命令 mvn -deploy -e 打包后, ...

  8. UTF-8文件编码格式中有无签名问题汇总(BOM)

    UTF-8签名(UTF-8 signature)也叫做BOM(Byte order Mark),是UTF编码方案里用于标识编码的标准标记.如果多个文件设置了签名,在二进制流中就会包含多个UTF-8签名 ...

  9. Python文件夹与文件的操作 ZZ

    最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...

  10. JBOSS参数调优

        阅读目录 JBOSS参数调优 jvm调优讲解1 JVM调优讲解2 JVM常见配置汇总 JBOSS生产环境下JVM调优 JBOSS瘦身 JBoss性能优化:内存紧张的问题终于解决了(转载)--- ...