经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
react系列(三)组件间通信
来源:cnblogs  作者:liuyongjia  时间:2018/9/28 16:51:45  对本文有异议

组件间通信

React的基本组件元素是一个个组件,组件之间可能存在关联、组合等关系。不同的组件之间,经常会发生数据传递或者交换,我们称之为组件间通信。
根据传递的复杂程度,可以分为三种情况:
父子间通信,兄弟间通信,同其他外部库通信。

父子间通信

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

  1. /* 父组件 */
  2. export default class NameInput extends Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. value: "default"
  7. };
  8. this.handleSubChange = this.handleSubChange.bind(this);
  9. }
  10. handleSubChange(newValue) {
  11. this.setState({ value: newValue });
  12. }
  13. render() {
  14. return (
  15. <div>
  16. <div>{this.state.value}</div>
  17. <Sub sub="sub1" subClick={this.handleSubChange} />
  18. </div>
  19. );
  20. }
  21. }
  1. /* 子组件 */
  2. export default class NameInput extends Component {
  3. constructor(props) {
  4. super(props);
  5. this.handleChange = this.handleChange.bind(this);
  6. }
  7. handleChange() {
  8. this.props.subClick("new sub");
  9. }
  10. render() {
  11. return <div onClick={this.handleChange}>{this.props.sub}</div>;
  12. }
  13. }

在这个例子里,通过调用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。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号