Ответ 1
Документы React подробно описывают это в разделе " Связь между компонентами" и " Несколько компонентов". Суть в том, что родитель должен передать функцию в качестве опоры для ребенка, и ребенок должен вызывать эту функцию в качестве обратного вызова, когда это необходимо:
var TabsExample = React.createClass({
handleTabClick: function(item) {
// Do something with item, maybe set it as active.
},
render: function() {
var tabs = [
{title: 'first', content: 'Content 1'},
{title: 'second', content: 'Content 2'}
];
return <div>
<TabsSwitcher items={tabs} onTabClick={this.handleTabClick}/>
<TabsContent items={tabs}/>
</div>;
}
});
var TabsSwitcher = React.createClass({
render: function() {
var items = this.props.items.map(function(item) {
return <a onClick={this.onClick.bind(this, item)}>{item.title}</a>;
}.bind(this));
return <div>{items}</div>;
},
onClick: function(item) {
this.props.onTabClick(item);
}
});
Для компонента TabsContent
вы должны переместить tabs
в состояние TabsExample
, чтобы React мог автоматически повторно отображать для вас, когда они меняются. Поскольку TabsSwitcher
и TabsContent
передаются вкладки в методе рендеринга, React знает, что они зависят от вкладок и будут повторно отображать при изменении состояния:
var TabsExample = React.createClass({
getInitialState: function() {
return {
activeTabId: 1,
tabs: [
{title: 'first', content: 'Content 1', id: 1},
{title: 'second', content: 'Content 2', id: 2}
]
};
};
handleTabClick: function(item) {
// Call `setState` so React knows about the updated tab item.
this.setState({activeTabId: item.id});
},
render: function() {
return (
<div>
<TabsSwitcher items={this.state.tabs}
activeItemId={this.state.activeTabId}
onTabClick={this.handleTabClick}/>
<TabsContent items={this.state.tabs}
activeItemId={this.state.activeTabId}/>
</div>
);
}
});