Isso pode estar trilhando essa linha entre respondente e opinativo, mas eu estou indo e voltando sobre como estruturar um componente ReactJS à medida que a complexidade cresce e pode usar alguma direção.
Vindo do AngularJS, quero passar meu modelo para o componente como uma propriedade e fazer com que o componente modifique o modelo diretamente. Ou devo dividir o modelo em várias state
propriedades e compilá-lo novamente ao enviá-lo de volta? Qual é a maneira ReactJS?
Veja o exemplo de um editor de postagem no blog. Tentar modificar o modelo diretamente acaba parecendo:
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>
);
}
});
O que parece errado.
É mais a maneira React de criar nossa text
propriedade de modelo state
e compilá-la novamente no modelo antes de salvar 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>
);
}
});
Isso não requer uma chamada this.forceUpdate()
, mas à medida que o modelo cresce, (uma postagem pode ter um autor, assunto, tags, comentários, classificações, etc ...) o componente começa a ficar realmente complicado.
O primeiro método com o ReactLink é o caminho a seguir?
text
campo, tenhamos umsetText
método que faça validação e outras coisas. Eu posso ver o método (2) funcionando sesetText
for puro e retornar uma nova instância do modelo. No entanto, sesetText
apenas atualizar o estado interno, ainda precisaríamos chamarforceUpdate
, certo?