Może to oznaczać stąpanie po granicy między odpowiedzialnym a upartym, ale będę poruszać się w tę iz powrotem, jak skonstruować komponent ReactJS w miarę wzrostu złożoności i przydałby się jakiś kierunek.
Pochodząc z AngularJS, chcę przekazać mój model do komponentu jako właściwość i pozwolić komponentowi bezpośrednio modyfikować model. A może powinienem podzielić model na różnestate właściwości i skompilować go z powrotem podczas wysyłania z powrotem w górę? Jak działa ReactJS?
Weź przykład edytora postów na blogu. Próba bezpośredniej modyfikacji modelu kończy się następująco:
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>
);
}
});
Co wydaje się niewłaściwe.
Czy jest to bardziej sposób Reacta na utworzenie naszej textwłaściwości modelu statei skompilowanie go z powrotem do modelu przed zapisaniem, na przykład:
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>
);
}
});
Nie wymaga to wywołania this.forceUpdate(), ale wraz z rozwojem modelu (post może mieć autora, temat, tagi, komentarze, oceny itp.), Komponent zaczyna być naprawdę skomplikowany.
Czy pierwsza metoda z ReactLink jest najlepsza?

textpola mamysetTextmetodę, która wykonuje walidację i kilka innych rzeczy. Widzę, że metoda (2) działa, jeślisetTextjest czysta i zwraca zupełnie nową instancję modelu. Jednakże, gdybyśmysetTexttylko zaktualizowali stan wewnętrzny, nadal musielibyśmy zadzwonićforceUpdate, prawda?