Điều này có thể đang lấn át ranh giới giữa có thể trả lời và có ý kiến, nhưng tôi đang quay đi quay lại làm thế nào để cấu trúc một thành phần ReactJS khi độ phức tạp tăng lên và có thể sử dụng một số hướng.
Đến từ AngularJS, tôi muốn truyền mô hình của mình vào thành phần dưới dạng thuộc tính và để thành phần sửa đổi mô hình trực tiếp. Hay tôi nên chia mô hình thành các state
thuộc tính khác nhau và biên dịch nó lại với nhau khi gửi ngược dòng? Cách ReactJS là gì?
Lấy ví dụ về một trình soạn thảo bài đăng trên blog. Cố gắng sửa đổi trực tiếp mô hình sẽ trông giống như:
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>
);
}
});
Có vẻ như sai.
Nó có phải là cách React nhiều hơn để tạo thuộc tính text
mô hình của chúng tôi state
và biên dịch nó trở lại mô hình trước khi lưu như:
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>
);
}
});
Điều này không yêu cầu gọi đến this.forceUpdate()
, nhưng khi mô hình phát triển, (một bài đăng có thể có tác giả, chủ đề, thẻ, nhận xét, xếp hạng, v.v.) thì thành phần bắt đầu thực sự phức tạp.
Phương pháp đầu tiên với ReactLink có phải là cách tốt nhất không?
text
trường, chúng ta có mộtsetText
phương thức thực hiện xác thực và một số nội dung khác. Tôi có thể thấy phương thức (2) hoạt động nếusetText
là thuần túy và trả về một phiên bản hoàn toàn mới của mô hình. Tuy nhiên, nếusetText
chỉ cập nhật trạng thái bên trong, chúng ta vẫn cần gọiforceUpdate
, phải không?