React.js: Composer des composants pour créer des onglets
Je suis en train de faire un onglets composant. TabsSwitcher et TabsPanel doit être séparé des composants de sorte qu'ils pourraient être utilisés n'importe où dans les DOM, par exemple TabsSwitcher n'a pas à être suivie par TabsPanel.
Pour le faire fonctionner, j'ai besoin de quelque sorte de la connexion de ces éléments. En outre, TabsSwitcher doit être capable de dire TabsPanel lors d'un onglet a été cliqué.
/** @jsx React.DOM */
var TabsExample = React.createClass({
render: function() {
var tabs = [
{title: 'first', content: 'Content 1'},
{title: 'second', content: 'Content 2'}
];
return <div>
<TabsSwitcher items={tabs}/>
<TabsContent items={tabs}/>
</div>;
}
});
var TabsSwitcher = React.createClass({
render: function() {
var items = this.props.items.map(function(item) {
return <a onClick={this.onClick}>{item.title}</a>;
}.bind(this));
return <div>{items}</div>;
},
onClick: function(e) {
//notify TabsContent about the click
}
});
var TabsContent = React.createClass({
render: function() {
var items = this.props.items.map(function(item) {
return <div>{item.content}</div>;
});
return <div>{items}</div>;
}
});
React.renderComponent(
<TabsExample/>,
document.body
);
Quelle est la meilleure façon de le faire?
Solution: http://jsfiddle.net/NV/5YRG9/
source d'informationauteur NVI | 2014-01-01
Vous devez vous connecter pour publier un commentaire.
La Réagir docs couvrir en détail dans "La Communication Entre Les Composants" et "Plusieurs Composants". L'essentiel est que le parent doit passer une fonction comme une béquille pour l'enfant, et l'enfant doit appeler cette fonction comme une fonction de rappel lorsqu'il en a besoin:
Pour la
TabsContent
composant, vous devez déplacer lestabs
dans leTabsExample
de l'état afin de Réagir automatiquement un nouveau rendu pour vous quand ils changent. DepuisTabsSwitcher
etTabsContent
sont passés les onglets dans la méthode render, Réagir sait qu'ils sont dépendants sur les onglets et ré-rendus lorsque les changements d'état: