Це може бути вподобання цієї межі між відповідальним та впевненим, але я рухаюсь вперед і назад щодо того, як структурувати компонент 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
, правда?