如果您使用的终极版比我不要以为你在你的应用程序组件中设置状态。相反,状态在redux存储中处理并作为道具传递给您的应用程序组件。但我可能是错的,我不是一个专家。
如果你想处理你的应用程序组件的状态并通过上下文传递它,这应该让你开始。
import React from 'react';
import _ from 'underscore';
var AppHeader = React.createClass({
contextTypes: {
appManager: React.PropTypes.object
},
render() {
return <div>
<b>First Name:</b><span>{this.context.appManager.User.FirstName}</span><br/>
<b>Last Name:</b><span>{this.context.appManager.User.LastName}</span><br/>
</div>
}
});
var App = React.createClass({
getInitialState() {
return {
User: {
FirstName: '',
LastName: ''
}
}
},
childContextTypes: {
appManager: React.PropTypes.object
},
getChildContext() {
return {
appManager: {
User: _.extend({}, this.state.User)
}
}
},
setUserInfo() {
if (this.state.User.FirstName == 'Homer') {
this.setState({
User: { FirstName: 'Peter', LastName: 'Griffin' }
});
} else {
this.setState({
User: { FirstName: 'Homer', LastName: 'Simpson' }
});
}
},
render() {
return <div>
<h1>My App!</h1>
<input type="button" value="Update User Stat!" onClick={this.setUserInfo} />
<h3>Header Info</h3>
<AppHeader/>
<h3>The Content</h3>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lacus turpis, bibendum sit amet finibus nec, imperdiet ut nisi. Maecenas et orci vitae ante convallis iaculis at sit amet augue. Fusce est libero, interdum vitae interdum id, auctor eu ex. Donec pretium quis nibh et ornare. Donec sodales elit at vehicula rhoncus. In facilisis facilisis sem a tristique. Sed non nulla nec velit maximus aliquet sit amet vitae eros. In finibus tortor ut ipsum porttitor, et ullamcorper lorem facilisis. Sed porttitor turpis ac vulputate porta. Fusce gravida tellus elit, sed feugiat sapien tincidunt ut. Maecenas augue purus, dictum id eros a, tincidunt fringilla nisi. In eros neque, pulvinar ac velit vel, fermentum facilisis justo. Phasellus laoreet egestas tortor, id tincidunt eros tempus et. Morbi et diam ut ante sodales eleifend et eu lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec sodales eget ex sit amet interdum.
</p>
</div>
}
})
export default App;
对于上下文的工作,您需要在两个组件中进行设置。一个需要成为提供者,另一个需要成为接收者。就你而言,App组件需要通过使用childContextTypes属性和getChildContext方法定义上下文来为其子项提供上下文。
childContextTypes: {
appManager: React.PropTypes.object
},
getChildContext() {
return {
appManager: {
User: _.extend({}, this.state.User)
}
}
},
然后在子组件将其标记为使用contextTypes财产,像这样的接收器:
contextTypes: {
appManager: React.PropTypes.object
},
通过这样做,你不直接通过道具这两个组件链接。子组件将能够使用this.context [无论您在父项中提供了什么,在这种情况下'appManager']。[在'appManager'上定义的任何方法或属性,在本例中为'User']
用户属性将是App组件中用户状态的副本。
User: _.extend({}, this.state.User)
在此示例中,如果您单击该按钮,它将更改App组件中的状态,该状态将通过上下文更新所有子组件。为了看到这个行动,我做了一个webpackbin you to play with。
只有当你不知道你的孩子会是什么,但仍然需要提供数据时,这是有用的。更简单的解决方案是将用户作为道具直接传递给孩子。
我想我可以使用redux –