Це може бути вподобання цієї межі між відповідальним та впевненим, але я рухаюсь вперед і назад щодо того, як структурувати компонент ReactJS, коли складність зростає і може використовувати певний напрямок.
Починаючи з AngularJS, я хочу передати свою модель в компонент як властивість і змусити компонент змінити модель безпосередньо. Або я повинен розбивати модель на різні stateвластивості та компілювати її разом, коли надсилаю назад вгору? Який спосіб ReactJS?
Візьмемо приклад редактора публікацій в блозі. Спроба модифікувати модель безпосередньо виглядає так:
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>
);
}
});
Що здається неправильним.
Чи це більше спосіб React зробити textвластивість нашої моделі stateта скомпілювати її назад в модель перед збереженням:
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>
);
}
});
Це не вимагає дзвінка this.forceUpdate(), але в міру зростання моделі (у публікації може бути автор, тема, теги, коментарі, рейтинги тощо) компонент починає ускладнюватися.
Перший спосіб з ReactLink - це шлях?

textполя у нас єsetTextметод, який робить перевірку та деякі інші речі. Я бачу метод (2), який працює, якщоsetTextвін чистий, і повертає абсолютно новий екземпляр моделі. Однак, якщоsetTextпросто оновити внутрішній стан, нам все-таки потрібно зателефонуватиforceUpdate, правда?