以上这个例子,子组件通过 prop拿到了text值以及checked的属性值;那么当子组件要拿到祖父级组件的信息,也是可以通过prop进行逐层的获取。来看下下面的例子。
- <span style="font-size:18px;">var Button = React.createClass({  
 
-   render: function() {  
 
- return (  
 
-       <button style={{background: this.props.color}}>  
 
-         {this.props.children}  
 
-       </button>  
 
-     );  
 
-   }  
 
- });  
 
- var Message = React.createClass({  
 
-   render: function() {  
 
- return (  
 
-       <div>  
 
-         {this.props.text} <Button color={this.props.color}>Delete</Button>  
 
-       </div>  
 
-     );  
 
-   }  
 
- });  
 
- var MessageList = React.createClass({  
 
-   render: function() {  
 
- var color = "purple";  
 
- var children = this.props.messages.map(function(message) {  
 
- return <Message text={message.text} color={color} />;  
 
-     });  
 
- return <div>{children}</div>;  
 
-  }  
 
- });</span>  
 
 
以上的例子中第一层组件(MessageList)想要将color值传递到第三层组件(Button),通过第二层组件(Message)进行了传递。进而实现了。但是这种方式,并不是很优雅,如果传递的层级更多时,中间的层级都需要来传递,数据的传递变的更加繁琐。所以我们就会想到,是否可以"越级"获取数据。这时候就需要使用context。能帮你 "越级" 传递数据到组件中你想传递到的深层次组件中。
 
  二.(父组件)向更深层的(子组件) 进行传递信息  >>利用(context)
利用context,改进后的代码如下:
- <span style="font-size:18px;">var Button = React.createClass({  
 
-   
 
-   contextTypes: {  
 
-     color: React.PropTypes.string  
 
-   },  
 
-   render: function() {  
 
-     return (  
 
-       <button style={{background: this.context.color}}>  
 
-         {this.props.children}  
 
-       </button>  
 
-     );  
 
-   }  
 
- });  
 
-   
 
- var Message = React.createClass({  
 
-   render: function() {  
 
-     return (  
 
-       <div>  
 
-         {this.props.text} <Button>Delete</Button>  
 
-       </div>  
 
-     );  
 
-   }  
 
- });  
 
-   
 
- var MessageList = React.createClass({  
 
-   
 
-   childContextTypes: {  
 
-     color: React.PropTypes.string  
 
-   },  
 
-   getChildContext: function() {  
 
-     return {color: "purple"};  
 
-   },  
 
-   render: function() {  
 
-     var children = this.props.messages.map(function(message) {  
 
-       return <Message text={message.text} />;  
 
-     });  
 
-     return <div>{children}</div>;  
 
-   }  
 
- });</span>  
 
 
以上代码中通过添加 childContextTypes 和 getChildContext() 到 第一层组件MessageList ( context 的提供者),React 自动向下传递数据然后在组件中的任意组件(也就是说任意子组件,在此示例代码中也就是 Button )都能通过定义 contextTypes(必须指定context的数据类型) 访问 context 中的数据。这样就不需要通过第二层组件进行传递了。
指定数据并要将数据传递下去的父组件要定义 childContextTypes 和 getChildContext() ;想要接收到数据的子组件 必须定义 contextTypes 来使用传递过来的 context 。
    三.(子组件)向(父组件)传递信息
来看下面的例子
 
- <span style="font-size:18px;">
 
- var MyContainer = React.createClass({  
 
-   getInitialState: function () {  
 
-     return {  
 
-       checked: false  
 
-     };  
 
-   },  
 
-   onChildChanged: function (newState) {  
 
-     this.setState({  
 
-       checked: newState  
 
-     });  
 
-   },  
 
-   render: function() {  
 
-     var isChecked = this.state.checked ? ‘yes‘ : ‘no‘;  
 
-     return (  
 
-       <div>  
 
-         <div>Are you checked: {isChecked}</div>  
 
-         <ToggleButton text="Toggle me"  
 
-           initialChecked={this.state.checked}  
 
-           callbackParent={this.onChildChanged}  
 
-           />  
 
-       </div>  
 
-     );  
 
-   }  
 
- });  
 
-   
 
- var ToggleButton = React.createClass({  
 
-   getInitialState: function () {  
 
-     return {  
 
-       checked: this.props.initialChecked  
 
-     };  
 
-   },  
 
-   onTextChange: function () {  
 
-     var newState = !this.state.checked;  
 
-     this.setState({  
 
-       checked: newState  
 
-     });  
 
-   
 
-     
 
-     this.props.callbackParent(newState);  
 
-   },  
 
-   render: function () {  
 
-     
 
-     var text = this.props.text;  
 
-     
 
-     var checked = this.state.checked;  
 
-         
 
-     return (  
 
-         <label>{text}: <input type="checkbox" checked={checked}                 onChange={this.onTextChange} /></label>  
 
-     );  
 
-   }  
 
- });</span>  
 
 
 
以上例子中,在父组件绑定callbackParent={this.onChildChanged},在子组件利用this.props.callbackParent(newState),触发了父级的的this.onChildChanged方法,进而将子组件的数据(newState)传递到了父组件。
这样做其实是依赖 props 来传递事件的引用,并通过回调的方式来实现的。
 
 四.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)
如果组件之间没有任何嵌套关系,组件嵌套层次比较深,我们该怎样去传递信息呢?
下面来看一个例子
这个例子需要引入一个PubSubJS 库,通过这个库你可以订阅的信息,发布消息以及消息退订。
PubSubJS 具体可参考下面的内容http://blog.csdn.net/u011439689/article/details/51955991
 
 
- <span style="font-size:18px;">
 
- var ProductList = React.createClass({  
 
-     render: function () {  
 
-       return (  
 
-         <div>  
 
-           <ProductSelection />  
 
-           <Product name="product 1" />  
 
-           <Product name="product 2" />  
 
-           <Product name="product 3" />  
 
-         </div>  
 
-       );  
 
-     }  
 
- });  
 
- var ProductSelection = React.createClass({  
 
-   getInitialState: function() {  
 
-     return {  
 
-       selection: ‘none‘  
 
-     };  
 
-   },  
 
-   componentDidMount: function () {  
 
-     
 
-     this.pubsub_token = PubSub.subscribe(‘products‘, function (topic, product) {  
 
-       this.setState({  
 
-         selection: product  
 
-       });  
 
-     }.bind(this));  
 
-   },  
 
-   componentWillUnmount: function () {  
 
-     
 
-     PubSub.unsubscribe(this.pubsub_token);  
 
-   },  
 
-   render: function () {  
 
-     return (  
 
-       <p>You have selected the product : {this.state.selection}</p>  
 
-     );  
 
-   }  
 
- });  
 
-   
 
- var Product = React.createClass({  
 
-   onclick: function () {  
 
-     
 
-     PubSub.publish(‘products‘, this.props.name);  
 
-   },  
 
-   render: function() {  
 
-     return <div onClick={this.onclick}>{this.props.name}</div>;  
 
-   }  
 
- });</span>  
 
 
 
ProductSelection和Product本身是没有嵌套关系的,而是兄弟层级的关系。但通过在ProductSelection组件中订阅一个消息,在Product组件中又发布了这个消息,使得两个组件又产生了联系,进行传递的信息。所以根据我个人的理解,当两个组件没有嵌套关系的时候,也要通过全局的一些事件等,让他们联系到一起,进而达到传递信息的目的。
 
 五.利用react-redux进行组件之间的状态信息共享
如果是比较大型的项目,可以使用react-redux,这方面的资料可以参考阮一峰的网络日志。
地址:http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.