Dies mag die Grenze zwischen verantwortungsbewusst und eigensinnig überschreiten, aber ich gehe hin und her, wie eine ReactJS-Komponente mit zunehmender Komplexität strukturiert werden kann und eine Richtung verwenden könnte.
Aus AngularJS kommend möchte ich mein Modell als Eigenschaft an die Komponente übergeben und die Komponente das Modell direkt ändern lassen. Oder sollte ich das Modell in verschiedene stateEigenschaften aufteilen und beim Zusammensenden wieder zusammenstellen? Was ist der ReactJS-Weg?
Nehmen Sie das Beispiel eines Blogpost-Editors. Der Versuch, das Modell direkt zu ändern, sieht folgendermaßen aus:
var PostEditor = React.createClass({
updateText: function(e) {
var text = e.target.value;
this.props.post.text = text;
this.forceUpdate();
},
render: function() {
return (
<input value={this.props.post.text} onChange={this.updateText}/>
<button onClick={this.props.post.save}/>Save</button>
);
}
});
Welches scheint falsch.
Ist es eher die React-Methode, um unsere textModelleigenschaft zu stateerstellen und sie vor dem Speichern wieder in das Modell zu kompilieren?
var PostEditor = React.createClass({
getInitialState: function() {
return {
text: ""
};
},
componentWillMount: function() {
this.setState({
text: this.props.post.text
});
},
updateText: function(e) {
this.setState({
text: e.target.value
});
},
savePost: function() {
this.props.post.text = this.state.text;
this.props.post.save();
},
render: function() {
return (
<input value={this.state.text} onChange={this.updateText}/>
<button onClick={this.savePost}/>Save</button>
);
}
});
Dies erfordert keinen Aufruf von this.forceUpdate(), aber wenn das Modell wächst (ein Beitrag kann einen Autor, einen Betreff, Tags, Kommentare, Bewertungen usw. enthalten), wird die Komponente sehr kompliziert.

text, wir haben anstelle eines Feldes einesetTextMethode, die die Validierung und einige andere Dinge ausführt. Ich kann sehen, dass Methode (2) funktioniert, wenn siesetTextrein ist und eine brandneue Instanz des Modells zurückgibt. WennsetTextwir jedoch nur den inneren Zustand aktualisieren, müssten wir immer noch aufrufenforceUpdate, oder?