Cela peut marcher sur cette ligne entre responsable et opiniâtre, mais je vais et vient sur la façon de structurer un composant ReactJS à mesure que la complexité augmente et pourrait utiliser une certaine direction.
Venant d'AngularJS, je souhaite transmettre mon modèle au composant en tant que propriété et demander au composant de modifier directement le modèle. Ou devrais-je diviser le modèle en différentes state
propriétés et le recompiler lors du renvoi en amont? Quelle est la manière ReactJS?
Prenons l'exemple d'un éditeur d'articles de blog. Essayer de modifier le modèle finit directement par ressembler à:
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>
);
}
});
Ce qui semble faux.
Est-ce plus la manière React de créer notre text
propriété de modèle state
et de la recompiler dans le modèle avant de l'enregistrer comme:
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>
);
}
});
Cela ne nécessite pas d'appel this.forceUpdate()
, mais au fur et à mesure que le modèle grandit (un article peut avoir un auteur, un sujet, des balises, des commentaires, des notes, etc.), le composant commence à devenir vraiment compliqué.
La première méthode avec ReactLink est-elle la voie à suivre?
text
champ, nous ayons unesetText
méthode qui effectue la validation et d'autres choses. Je peux voir la méthode (2) fonctionner si ellesetText
est pure et renvoie une toute nouvelle instance du modèle. Cependant, sisetText
nous mettions simplement à jour l'état interne, nous aurions encore besoin d'appelerforceUpdate
, non?