Zwei Dinge springen auf mich, wenn ich Ihren Code ansehe.
Die erste besteht darin, dass Sie ein Array von React-Komponenten aus der renderTemplates-Funktion zurückgeben. Dies kann in Ordnung sein, abhängig davon, wie Sie die Ausgabe verwenden. Der Schlüssel zur Erinnerung ist, dass der Rückgabewert der Renderfunktion Ihrer Komponente eine einzelne React-Komponente sein muss (z. B. wenn Sie dieses Ergebnis in ein anderes JSX-Tag einschließen).
Zweitens scheint es so zu sein den Datenfluss von der Komponente auf oberster Ebene nach unten nicht zulassen; insbesondere, dass Sie die Row-Komponente nicht verwenden, um Daten an Column-Komponenten zu übergeben. Das macht das Schreiben Ihrer Schleife so schwierig. Anstatt zu versuchen, sowohl Zeilen als auch Spalten zu verwalten, müssen Sie nur die Daten, die für eine einzelne Zeile benötigt werden, an eine Zeilenkomponente übergeben. Die Row-Komponente übergibt dann alle Daten an eine Column-Komponente. Dies macht das Jonglieren von öffnenden und schließenden Tags überflüssig und vereinfacht den Code insgesamt.
Im Folgenden finden Sie eine Beispielimplementierung von dem, was ich beschrieben habe. Ich verwende tabellenbezogene Tags zum Rendern, aber Sie können divs oder was auch immer für Sie am geeignetsten ist. Zum Zeitpunkt des Schreibens gibt es nicht viele Informationen darüber, was in Templates enthalten ist. Daher habe ich ein dummer kleines Beispiel für die Verwendung erstellt.
var KvpColumn = React.createClass({
render: function() {
return <td>{this.props.kvp.key}: {this.props.kvp.value}</td>;
}
});
var KvpRow = React.createClass({
render: function() {
return (
<tr>
{this.props.items.map(function(item) {
return <KvpColumn key={item.key} kvp={item}/>;
})}
</tr>
);
}
});
var ObjectIDsTable = React.createClass({
render: function() {
var templates = this.props.templates;
var propertyNames = Object.getOwnPropertyNames(templates);
var group = [];
var rows = [];
var cols = Number(this.props.cols) || 2;
for(var i = 0; i < propertyNames.length; i++) {
var key = propertyNames[i];
group.push({key: key, value: templates[key]});
if(group.length === cols) {
rows.push(<KvpRow key={group[0].key} items={group}/>);
group = [];
}
}
if(group.length > 0) { // catch any leftovers
rows.push(<KvpRow key={group[0].key} items={group}/>);
}
return <table>{rows}</table>;
}
});
// something silly as a simple example
var templates = { a: 'b', c: 'd', e: 'f', g: 'h', i: 'j' };
React.render(<ObjectIDsTable templates={templates} cols="2"/>, document.getElementById('app'));
Wenn Sie Zugriff auf Unterstreichungs oder lodash, können Sie die Logik in ObjectIDsTable ein bisschen weiter vereinfachen (und vermeiden Schleifen zusammen zu schreiben!):
var ObjectIDsTable = React.createClass({
render: function() {
var templates = this.props.templates;
var rows = _.chain(Object.getOwnPropertyNames(templates))
.map(function(key) { return { key: key, value: templates[key] }; })
.chunk(this.props.cols || 2)
.map(function(group) { return <KvpRow key={group[0].key} items={group}/>; })
.value();
return <table>{rows}</table>;
}
});
Sie können dies auf Plunker in Aktion .
Kann jemand mir einen Vorschlag? – alwaysLearn
Können Sie Beispieldaten angeben, welcher 'templates'-Wert und der entsprechende Wert für 'html' erwartet werden? – Gaurav