Esto puede estar pisando esa línea entre responsable y obstinado, pero estoy yendo y viniendo sobre cómo estructurar un componente ReactJS a medida que crece la complejidad y podría usar alguna dirección.
Viniendo de AngularJS, quiero pasar mi modelo al componente como una propiedad y hacer que el componente modifique el modelo directamente. ¿O debería dividir el modelo en varias state
propiedades y volver a compilarlo cuando lo envíe de nuevo? ¿Cuál es la forma ReactJS?
Tome el ejemplo de un editor de publicaciones de blog. Intentar modificar el modelo directamente termina pareciéndose a:
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>
);
}
});
Lo que parece mal.
¿Es más la forma de reaccionar para hacer que nuestro text
modelo sea propiedad state
y compilarlo nuevamente en el modelo antes de guardarlo como:
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>
);
}
});
Esto no requiere una llamada this.forceUpdate()
, pero a medida que el modelo crece, (una publicación puede tener un autor, un tema, etiquetas, comentarios, calificaciones, etc.) el componente comienza a complicarse mucho.
¿Es el primer método con ReactLink el camino a seguir?
text
campo, tenemos unsetText
método que valida y algunas otras cosas. Puedo ver que el método (2) funciona sisetText
es puro y devuelve una nueva instancia del modelo. Sin embargo, sisetText
solo actualiza el estado interno, aún deberíamos llamarforceUpdate
, ¿verdad?