Questo potrebbe essere il confine tra responsabile e supponente, ma vado avanti e indietro su come strutturare un componente ReactJS man mano che la complessità cresce e potrebbe usare una direzione.
Provenendo da AngularJS, voglio passare il mio modello nel componente come proprietà e fare in modo che il componente modifichi direttamente il modello. O dovrei suddividere il modello in varie state
proprietà e ricompilarlo insieme durante l'invio a monte? Qual è il metodo ReactJS?
Prendi l'esempio di un editor di post sul blog. Cercare di modificare direttamente il modello finisce per sembrare:
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>
);
}
});
Il che sembra sbagliato.
È più il modo React per rendere la text
proprietà del nostro modello state
e ricompilarlo nel modello prima di salvare come:
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>
);
}
});
Ciò non richiede una chiamata a this.forceUpdate()
, ma man mano che il modello cresce (un post può avere un autore, un oggetto, tag, commenti, valutazioni, ecc ...) il componente inizia a diventare davvero complicato.
Il primo metodo con ReactLink è la strada da percorrere?
text
campo, abbiamo unsetText
metodo che esegue la convalida e alcune altre cose. Riesco a vedere il metodo (2) che funziona sesetText
è puro e restituisce una nuova istanza del modello. Tuttavia, se sisetText
aggiorna solo lo stato interiore, dovremmo comunque chiamareforceUpdate
, giusto?