React.js - Kommunikation zwischen gleichrangigen Komponenten
Ich bin neu zu Reagieren, und ich würde Sie gerne Fragen, wie eine Strategie in Frage, wie am besten, um eine Aufgabe durchzuführen, wobei Daten übertragen werden müssen, zwischen Geschwister-Komponenten.
Werde ich zunächst beschreiben Sie die Aufgabe:
Sagen, ich habe mehrere <select>
Komponenten, die Kinder sind von einem einzigen Elternteil, geht die select-Boxen dynamisch, bestehend aus einem array. Jede box hat genau die gleichen Optionen verfügbar sind, in seinen ursprünglichen Zustand, aber sobald ein Benutzer eine bestimmte option in einer box, muss diese deaktiviert werden, als option in allen anderen Feldern bis es gelöst ist.
Hier ist ein Beispiel der in der gleichen (dummen) code. (Ich bin mit react-select
als Kurzform für das erstellen der select-Boxen.)
In diesem Beispiel, die ich brauche, zu deaktivieren (ie, set disabled: true
) die Optionen für "It' s my favorite" und "It' s my least favorite", wenn ein Benutzer wählt in einer select-box (und Sie loslassen, wenn ein Benutzer de-diese auswählt).
JS:
var React = require('react');
var Select = require('react-select');
var AnForm = React.createClass({
render: function(){
//this.props.fruits is an array passed in that looks like:
//['apples', 'bananas', 'cherries','watermelon','oranges']
var selects = this.props.fruits.map(function(fruit, i) {
var options = [
{ value: 'first', label: 'It\'s my favorite', disabled: false },
{ value: 'second', label: 'I\'m OK with it', disabled: false },
{ value: 'third', label: 'It\'s my least favorite', disabled: false }
];
return (
<Child fruit={fruit} key={i} options={options} />
);
});
return (
<div id="myFormThingy">
{fruitSelects}
</div>
)
}
});
var AnChild = React.createClass({
getInitialState: function() {
return {
value:'',
options: this.props.options
};
},
render: function(){
function changeValue(value){
this.setState({value:value});
}
return (
<label for={this.props.fruit}>{this.props.fruit}</label>
<Select
name={this.props.fruit}
value={this.state.value}
options={this.state.options}
onChange={changeValue.bind(this)}
placeholder="Choose one"
/>
)
}
});
Ist die Aktualisierung der untergeordneten Optionen erreicht man am besten durch die Weitergabe der Daten zurück bis zu den Eltern durch einen Rückruf? Sollte ich refs, um Zugriff auf die untergeordneten Komponenten in diesem callback? Hat eine redux reducer helfen?
Ich entschuldige mich für die Allgemeine Art der Frage, aber ich bin nicht, finden eine Menge von der Richtung, die auf den Umgang mit diesen sibling-zu-sibling-Komponente Interaktionen in einer unidirektionalen Weise.
Vielen Dank für jede Hilfe.
- ja, ja, und ja, in einer anderen Weise; redux wird es einfacher, wie die Verwendung von globalen Variablen würde, weil, gut, das ist im Grunde, was es tut, aus der Perspektive der Komponente logic.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TLDR: ja, sollten Sie eine Requisiten-von-oben-nach-unten-und change-Handler-von-unten-nach-oben-Ansatz. Aber das kann sperrig in einer größeren Anwendung, so können Sie verwenden design patterns wie Flux oder Redux reduziert Ihre Komplexität.
Einfachen Ansatz Reagieren
Reagieren-Komponenten erhalten Ihre "inputs" als Requisiten; und Sie kommunizieren Ihre "output" durch den Aufruf von Funktionen, die übergeben wurden, um Sie als Requisiten. Eine kanonische Beispiel:
Passieren Sie den ersten Wert in einen prop; und eine änderung handler in einem anderen prop.
Wer kann die übergabe von Werten und ändern Handler eine Komponente? Nur Ihre Eltern. (Gut, es gibt eine Ausnahme: Sie können den Kontext zu teilen Informationen zwischen den Komponenten, aber das ist eine erweiterte Konzept, und wird genutzt werden, um im nächsten Beispiel.)
So, in jedem Fall, es ist die parent-Komponente der Ihren wählt, der sollte verwalten den input für Ihr auswählt. Hier ist ein Beispiel:
Redux
Der größte Nachteil des obigen Ansatzes ist, dass Sie haben, um an eine Menge von Informationen von oben nach unten, als Ihre Anwendung wächst, wird dies schwierig zu verwalten. Reagieren-Redux nutzt Reagieren die Kontext-Funktion zu aktivieren untergeordnete Komponenten zum Zugriff auf Ihren Shop direkt und vereinfachen damit Ihre Architektur.
Beispiel (um nur einige der wichtigsten Stücke Ihres redux-Anwendung - siehe reagieren-redux-Dokumentation, wie Draht diese zusammen, z.B. createStore, Provider...):
Wie Sie sehen können, die Logik in der Redux Beispiel ist die gleiche wie die Vanille Reagieren-code. Aber es ist nicht enthalten in der übergeordneten Komponente, aber in der Reduzier-und Hilfsfunktionen (Selektoren). Eine anstelle von top-down-Weitergabe von Requisiten, Reagieren-Redux verbindet jede einzelne Komponente an den Staat, wodurch ein einfacher, modularer, einfacher zu wartenden code.
Folgende mir helfen, um das setup der Kommunikation zwischen zwei Geschwistern. Die Einrichtung ist in Ihrem übergeordneten Element während der render() und componentDidMount () - Aufrufe.