组件之间传递信息方式,总体可分为以下5种:

1.(父组件)向(子组件)传递信息

2.(父组件)向更深层的(子组件) 进行传递信息  >>利用(context)

3.(子组件)向(父组件)传递信息

4.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)

5.利用react-redux进行组件之间的状态信息共享

一.(父组件)向(子组件)传递信息 >>>主要是通过 prop进行传值

来看下面的例子

  1. <span style="font-size:18px;">//父组件
  2. var MyContainer = React.createClass({
  3. getInitialState: function () {
  4. return {
  5. checked: false
  6. };
  7. },
  8. render: function() {
  9. return (
  10. <ToggleButton text="Toggle me" checked={this.state.checked} />
  11. );
  12. }
  13. });
  14. // 子组件
  15. var ToggleButton = React.createClass({
  16. render: function () {
  17. // 从(父组件)获取的值
  18. var checked = this.props.checked,
  19. text = this.props.text;
  20. return (
  21. <label>{text}: <input type="checkbox" checked={checked} /></label>
  22. );
  23. }
  24. });</span>

以上这个例子,子组件通过 prop拿到了text值以及checked的属性值;那么当子组件要拿到祖父级组件的信息,也是可以通过prop进行逐层的获取。来看下下面的例子。

官方文档的示例代码如下:

  1. <span style="font-size:18px;">var Button = React.createClass({
  2. render: function() {
  3. return (
  4. <button style={{background: this.props.color}}>
  5. {this.props.children}
  6. </button>
  7. );
  8. }
  9. });
  10. var Message = React.createClass({
  11. render: function() {
  12. return (
  13. <div>
  14. {this.props.text} <Button color={this.props.color}>Delete</Button>
  15. </div>
  16. );
  17. }
  18. });
  19. var MessageList = React.createClass({
  20. render: function() {
  21. var color = "purple";
  22. var children = this.props.messages.map(function(message) {
  23. return <Message text={message.text} color={color} />;
  24. });
  25. return <div>{children}</div>;
  26. }
  27. });</span>

以上的例子中第一层组件(MessageList)想要将color值传递到第三层组件(Button),通过第二层组件(Message)进行了传递。进而实现了。但是这种方式,并不是很优雅,如果传递的层级更多时,中间的层级都需要来传递,数据的传递变的更加繁琐。所以我们就会想到,是否可以"越级"获取数据。这时候就需要使用context。能帮你 "越级" 传递数据到组件中你想传递到的深层次组件中。

二.(父组件)向更深层的(子组件) 进行传递信息  >>利用(context)

利用context,改进后的代码如下:

  1. <span style="font-size:18px;">var Button = React.createClass({
  2. // 必须指定context的数据类型
  3. contextTypes: {
  4. color: React.PropTypes.string
  5. },
  6. render: function() {
  7. return (
  8. <button style={{background: this.context.color}}>
  9. {this.props.children}
  10. </button>
  11. );
  12. }
  13. });
  14. var Message = React.createClass({
  15. render: function() {
  16. return (
  17. <div>
  18. {this.props.text} <Button>Delete</Button>
  19. </div>
  20. );
  21. }
  22. });
  23. var MessageList = React.createClass({
  24. //父组件要定义 childContextTypes 和 getChildContext()
  25. childContextTypes: {
  26. color: React.PropTypes.string
  27. },
  28. getChildContext: function() {
  29. return {color: "purple"};
  30. },
  31. render: function() {
  32. var children = this.props.messages.map(function(message) {
  33. return <Message text={message.text} />;
  34. });
  35. return <div>{children}</div>;
  36. }
  37. });</span>

以上代码中通过添加 childContextTypes 和 getChildContext() 到 第一层组件MessageList ( context 的提供者),React 自动向下传递数据然后在组件中的任意组件(也就是说任意子组件,在此示例代码中也就是 Button )都能通过定义 contextTypes(必须指定context的数据类型) 访问 context 中的数据。这样就不需要通过第二层组件进行传递了。

指定数据并要将数据传递下去的父组件要定义 childContextTypes 和 getChildContext() ;想要接收到数据的子组件 必须定义 contextTypes 来使用传递过来的 context 。

三.(子组件)向(父组件)传递信息

来看下面的例子

  1. <span style="font-size:18px;">// 父组件
  2. var MyContainer = React.createClass({
  3. getInitialState: function () {
  4. return {
  5. checked: false
  6. };
  7. },
  8. onChildChanged: function (newState) {
  9. this.setState({
  10. checked: newState
  11. });
  12. },
  13. render: function() {
  14. var isChecked = this.state.checked ? 'yes' : 'no';
  15. return (
  16. <div>
  17. <div>Are you checked: {isChecked}</div>
  18. <ToggleButton text="Toggle me"
  19. initialChecked={this.state.checked}
  20. callbackParent={this.onChildChanged}
  21. />
  22. </div>
  23. );
  24. }
  25. });
  26. // 子组件
  27. var ToggleButton = React.createClass({
  28. getInitialState: function () {
  29. return {
  30. checked: this.props.initialChecked
  31. };
  32. },
  33. onTextChange: function () {
  34. var newState = !this.state.checked;
  35. this.setState({
  36. checked: newState
  37. });
  38. //这里将子组件的信息传递给了父组件
  39. this.props.callbackParent(newState);
  40. },
  41. render: function () {
  42. // 从(父组件)获取的值
  43. var text = this.props.text;
  44. // 组件自身的状态数据
  45. var checked = this.state.checked;
  46. //onchange 事件用于单选框与复选框改变后触发的事件。
  47. return (
  48. <label>{text}: <input type="checkbox" checked={checked}                 onChange={this.onTextChange} /></label>
  49. );
  50. }
  51. });</span>

以上例子中,在父组件绑定callbackParent={this.onChildChanged},在子组件利用this.props.callbackParent(newState),触发了父级的的this.onChildChanged方法,进而将子组件的数据(newState)传递到了父组件。
这样做其实是依赖 props 来传递事件的引用,并通过回调的方式来实现的。

四.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)

如果组件之间没有任何嵌套关系,组件嵌套层次比较深,我们该怎样去传递信息呢?

下面来看一个例子

这个例子需要引入一个PubSubJS 库,通过这个库你可以订阅的信息,发布消息以及消息退订。
PubSubJS 具体可参考下面的内容http://blog.csdn.net/u011439689/article/details/51955991

  1. <span style="font-size:18px;">// 定义一个容器(将ProductSelection和Product组件放在一个容器中)
  2. var ProductList = React.createClass({
  3. render: function () {
  4. return (
  5. <div>
  6. <ProductSelection />
  7. <Product name="product 1" />
  8. <Product name="product 2" />
  9. <Product name="product 3" />
  10. </div>
  11. );
  12. }
  13. });
  14. // 用于展示点击的产品信息容器
  15. var ProductSelection = React.createClass({
  16. getInitialState: function() {
  17. return {
  18. selection: 'none'
  19. };
  20. },
  21. componentDidMount: function () {
  22. //通过PubSub库订阅一个信息
  23. this.pubsub_token = PubSub.subscribe('products', function (topic, product) {
  24. this.setState({
  25. selection: product
  26. });
  27. }.bind(this));
  28. },
  29. componentWillUnmount: function () {
  30. //当组件将要卸载的时候,退订信息
  31. PubSub.unsubscribe(this.pubsub_token);
  32. },
  33. render: function () {
  34. return (
  35. <p>You have selected the product : {this.state.selection}</p>
  36. );
  37. }
  38. });
  39. var Product = React.createClass({
  40. onclick: function () {
  41. //通过PubSub库发布信息
  42. PubSub.publish('products', this.props.name);
  43. },
  44. render: function() {
  45. return <div onClick={this.onclick}>{this.props.name}</div>;
  46. }
  47. });</span>

ProductSelection和Product本身是没有嵌套关系的,而是兄弟层级的关系。但通过在ProductSelection组件中订阅一个消息,在Product组件中又发布了这个消息,使得两个组件又产生了联系,进行传递的信息。所以根据我个人的理解,当两个组件没有嵌套关系的时候,也要通过全局的一些事件等,让他们联系到一起,进而达到传递信息的目的。

五.利用react-redux进行组件之间的状态信息共享

如果是比较大型的项目,可以使用react-redux,这方面的资料可以参考阮一峰的网络日志。
地址:http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.

React组件间信息传递方式的更多相关文章

  1. React 组件间通讯

    React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...

  2. React 组件间通信介绍

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

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

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

  4. react组件间的传值方法

    关于react的几个网站: http://react.css88.com/ 小书:http://huziketang.mangojuice.top/books/react/ http://www.re ...

  5. React组件间的通讯

    组件化开发应该是React核心功能之一,组件之间的通讯也是我们做React开发必要掌握的技能.接下来我们将从组件之间的关系来分解组件间如何传递数据. 1.父组件向子组件传递数据 通讯是单向的,数据必须 ...

  6. React组件间通信-sub/pub机制

    React生命周期第二个demo演示了兄弟组件的通信,需要通过父组件,比较麻烦:下面介绍sub/pub机制来事项组件间通信. 1.导包 npm i pubsub-js 2.UserSearch.jsx ...

  7. React 组件间通信 总结

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

  8. react组件间传值详解

    一.父子组件间传值     <1>父传子         父组件:

  9. React 组件间传值

    壹  .了解React传值的数据 一. 创建组件的方法 一 . 1  通过function声明的组件特点是: 1)function创建的组件是没有state属性,而state属性决定它是不是有生命周期 ...

随机推荐

  1. encodeURI()和encodeURIcomponent()的共同点和不同点

    共同点: 1.encodeURI和encodeURIcomponent都是Global对象, Global对象在某种意义上是违一个终极的兜底对象,换句话说,不属于任何其他对象的属性和方法,最终都是她的 ...

  2. [置顶] kubernetes1.8发布跟踪

    一.Kubernetes发布历史回顾 1.        Kubernetes 1.0 - 2015年7月发布 2.        Kubernetes 1.1 - 2015年11月发布 3.     ...

  3. Vim技能修炼教程(11) - 代码折叠

    上一讲我们是程序员篇的第一讲,关于代码跳转.代码跳转是一个付出很少收获很大的功能.这一节我们开始一个收获很多,但是付出也相对多一点功能:代码折叠. 代码折叠 折叠的类型 折叠有下面几种类型: * Ma ...

  4. Android内存优化(四)解析Memory Monitor、Allocation Tracker和Heap Dump

    相关文章 Android性能优化系列 Java虚拟机系列 前言 要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具.本篇就来介绍内存 ...

  5. 使用编译时注解简单实现类似 ButterKnife 的效果

    这篇文章是学习鸿洋前辈的 Android 如何编写基于编译时注解的项目 的笔记,用于记录我的学习收获. 读完本文你将了解: 什么是编译时注解 APT 编译时注解如何使用与编写 举个例子 思路 创建注解 ...

  6. Xcode5.1.1支持低版本和image not found和Couldn't register XXXX with the bootstrap server. Error: unknown error code.

    一:问题  targets中证书的设置 1.项目支持多设备(Xcode5.1.1支持低版本) 2.真机测试要确保Code Siging 设置没问题 支持的最低版本 二 :问题:image  not f ...

  7. Luogu 3690 Link Cut Tree

    Luogu 3690 Link Cut Tree \(LCT\) 模板题.可以参考讲解和这份码风(个人认为)良好的代码. 注意用 \(set\) 来维护实际图中两点是否有直接连边,否则无脑 \(Lin ...

  8. BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*

    BZOJ3141 Hnoi2013 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点 ...

  9. CALayer1-简介

    一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. * 其实UIView之所以 ...

  10. 《DSP using MATLAB 》示例Example6.3

    代码: C0 = 0; B1 = [2 4; 3 1]; A1 = [1 1 0.9; 1 0.4 -0.4]; B2 = [0.5 0.7; 1.5 2.5; 0.8 1]; A2 = [1 -1 ...