Это может быть переходом на границу между ответственным и самоуверенным, но я возвращаюсь взад и вперед относительно того, как структурировать компонент 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()
, но по мере роста модели (сообщение может иметь автора, тему, теги, комментарии, рейтинги и т. Д.) Компонент начинает усложняться.
text
поля у нас естьsetText
метод, который выполняет проверку и некоторые другие вещи. Я вижу, что метод (2) работает, еслиsetText
он чистый и возвращает новый экземпляр модели. Однако, если бы мыsetText
просто обновили внутреннее состояние, нам все равно нужно было бы вызватьforceUpdate
, верно?