Reagieren bekommen Wert tief im inneren DOM
Ich bin nicht so vertraut mit reagieren, ich versuche, die folgende Abstraktion über sign in /Formulare etc.
Werfen Sie einen Blick auf diese:
var SignUpForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
console.log(this.refs.iitu_id.getDOMNode().value.trim())
//iitu_id = this.refs.iitu_id.getDOMNode().value.trim();
//password = this.refs.password.getDOMNode().value.trim();
var error = UserValidator.valid({iitu_id: iitu_id, password: password});
if (error) {
this.setState({"errors": error });
//console.log(error);
} else {
//console.log(error);
}
},
getInitialState: function() {
return {
'errors': {
iitu_id: null,
password: null
}
};
},
render: function() {
return (
/*jshint ignore:start */
<form className="form-horizontal" onSubmit={this.handleSubmit} >
<FormGroup label="iitu id" error_msg={this.state.errors.iitu_id} fieldName="iitu_id" fieldType="text" />
<FormGroup label="password" error_msg={this.state.errors.password} fieldName="password" fieldType="password" />
<ButtonGroup text="Войти"/>
</form>
/*jshint ignore:end */
);
}
});
var FormGroup = React.createClass({
render: function() {
var formGroupCss = 'form-group';
if (this.props.error_msg){
formGroupCss = 'form-group has-error';
}
return (
/*jshint ignore:start */
<div className={formGroupCss}>
<Label fieldName={this.props.fieldName}>{this.props.label}</Label>
<InputField type={this.props.fieldType}>{this.props.label}</InputField>
<label className="control-label" for="inputError1">{this.props.error_msg}</label>
</div>
/*jshint ignore:end */
);
}
});
var ButtonGroup = React.createClass({
render: function () {
return (
/*jshint ignore:start */
<div className="form-group">
<div className="col-sm-offset-2 col-sm-10">
<button className="btn btn-default">{this.props.text}</button>
</div>
</div>
/*jshint ignore:end */
);
}
});
var InputField = React.createClass({
render: function() {
return (
/*jshint ignore:start */
<div className="col-sm-5">
<input className="form-control" type={this.props.fieldType} placeholder={this.props.children}/>
</div>
/*jshint ignore:end */
);
}
});
exports.SignUpForm = SignUpForm;
es ist ein bisschen viel code, aber ich denke, es ist ziemlich leicht zu Lesen. Die Frage ist, wie bekomme ich den Wert meiner InputField Klasse, wenn ich drücken Sie die Schaltfläche "senden" (einfach nur Formular-Wert)? Es ist das problem, dass mein input-tag tief im inneren DOM. Weitere Frage, ist es gut zu haben, den folgenden code ein Entwurf, den ich meine, beschreiben jede logische Komponente, die als neue 'Klasse' ?
- Sie können den Zugriff auf dom-Knoten mit ref-nur innerhalb des angegebenen Komponente. Sie versuchen, es zu benutzen, gehen Sie durch einige Stufen des Kinder-Komponenten. Sie können versuchen, pass
ref
- Eigenschaft für jedes Kind ein Beispiel in dieser Frage oder auf die Modell-Schicht aus dem gewünschten Rahmen ( Backbone-oder Flussmittel zum Beispiel ). Ich würde versuchen, kombinieren einige Komponenten haben nur 1 level von Kind-Komponenten und vermeiden Sie die Weitergabe der Daten durch das Modell.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bezug auf Ihre zweite Frage - es ist ein schlechter Ansatz um eine Komponente hinzuzufügen, die für jedes logische element.
In deinem Beispiel - alle Komponenten (außer dem ersten) hat keine Logik, nur 'render'. dieses design fügt viele nutzlose Zeilen code, und "dies.props" Wiederholungen.
In deinem Beispiel würde ich einfach alles hinzuzufügen, um das Rendern der ersten Komponente.
Nun, lassen Sie sagen, Sie haben zwei Komponenten, und erreichen möchten, dass das Kind von den Eltern:
In deinem Beispiel gab es zu viele Komponenten innerhalb von Komponenten zu tun, was ich Tat.
Noch immer gibt es Fälle, wenn Sie lange brauchen linage von Kind-Komponenten. Die Nutzung dieser.refs.ein.refs.b.refs.c, etc - könnte ziemlich hässlich, und verhindert auch, dass re-usability.
in diesen Fällen versuchen, mit jedem der MVC-Architektur (ich verwende reflux und lieben es)
render: function(){ var inputForm = <div>boilerplate content</div> return(<div>{inputForm}</div>)}
. Wenn Sie möchten, um die Wiederverwendung in anderen Komponenten legte es in einen mixin-und Referenz -var inputForm = this.inputForm
. Aber ich habe nicht gesehen, Menschen, die dieses design.render: function(){ var inputForm = function(type){<input type={type}/>} return(<div>{inputForm(text)}</div>)}
. Ich glaube, das sollte funktionieren...Geben, wenn Sie Ihre Formular-Eingaben
name
Attribute verwenden, können Sie das Formular.elements
Sammlung für den Zugriff auf die Eingänge.Ich vor kurzem split der code newforms verwendet für diese in eine wiederverwendbare get-Formular-Daten - Modul, das würde lassen Sie dies tun-vorausgesetzt, Ihre Eingänge haben
name
Attribute:Oder, wenn Sie brauchen, um input zu erhalten, wie es angegeben wurde, können Sie eine
onChange
handler zu<form>
oder eine andere Komponente enthält, die die form Eingänge, anstatt jedes einzeln:In der Abwesenheit von einem Rahmen wie Eckige oder Flux, Schießen Sie Daten zwischen Ihren Komponenten mit Rückrufen.
Die hier verwendete Technik ist im detail erklärt Reagieren auf die website. Eine andere Lösung, jedoch ist die Verwendung einer Formular-Bibliothek. Ich nahm einen ähnlichen Weg und versucht, den Aufbau form-Komponenten von Grund auf neu-es funktioniert, aber es ist ein Weg, andere wurden bereits geräumt. Check-out newforms und reagieren-Formen.
Beachten Sie, dass der code, den ich geteilt ist ungetestet, aber es sollte sehr nah zu arbeiten.
Speziell, beachten Sie bitte die callback-Funktionen übergeben wird, von den Eltern auf das Kind.
updateForm
zu FormGrouphandleChange
zu InputFieldDann die Daten zurück an die Spitze, Sie einfach den Prozess umkehren.
<input/>
änderungen, es läufthandleChange
handleChange
läuft, übergibt er die FormGroup istfieldName
undvalue
zu SignUpFormIch würde vorschlagen, eine
onChange
Ereignis-listener, um Ihre Eingaben, die Rückrufe verwendet, um relais die Informationen, die Sie den ganzen Weg zurück bis zu Ihrer top-level-Komponente.dann passieren, dass die callback-down an die Basis-Ebene form-Felder und verwenden Sie für die Bedienung der
onChange
Veranstaltung.dann mit Ihrem
handleSubmit
nur die Ausgabe der Werte in derthis.state.inputs
Objekt.