EDIT: Tôi viết lại câu hỏi này để làm rõ những gì tôi đang theo dõi - cảm ơn bạn đến những người đã phản hồi cho đến nay giúp tôi trau dồi nó.Cách tiếp cận tốt để quản lý trạng thái lồng nhau trong React
Tôi đang cố gắng hiểu cách tốt nhất để quản lý trạng thái lồng nhau phức tạp trong React, đồng thời giới hạn số lần render()
được gọi cho các thành phần có nội dung không thay đổi.
Là nền:
Giả sử tôi có nhà nước với cả hai "tác giả" và "ấn" trong một đối tượng như thế này:
{
'authors' : {
234 : {
'name' : 'Alice Ames',
'bio' : 'Alice is the author of over ...',
'profile_pic' : 'http://....'
},
794 : {
'name' : 'Bob Blake',
'bio' : 'Hailing from parts unknown, Bob...',
'profile_pic' : 'http://....'
},
...more authors...
},
'publications' : {
539 : {
'title' : 'Short Story Vol. 2',
'author_ids' : [ 234, 999, 220 ]
},
93 : {
'title' : 'Mastering Fly Fishing',
'author_ids' : [ 234 ]
},
...more publications...
}
}
Trong ví dụ giả tạo này nhà nước có hai lĩnh vực chính, truy cập bằng cách các phím authors
và publications
.
Phím authors
dẫn đến một đối tượng được khóa trên ID của tác giả, dẫn đến đối tượng có dữ liệu tác giả.
Phím publications
dẫn đến một đối tượng được khóa trên ID của ấn phẩm có một số dữ liệu xuất bản và một loạt tác giả.
Giả sử trạng thái của tôi là trong một bộ phận App
với các thành phần con như giả sau JSX:
...
<App>
<AuthorList authors={this.state.authors} />
<PublicationList authors={this.state.authors} publications={this.state.publications} />
</App>
...
...
class AuthorList extends React.Component {
render() {
let authors = this.props.authors;
return (
<div>
{ Object.keys(authors).map((author_id) => {
return <Author author={authors[author_id]} />;
}
</div>
);
}
}
...
...
class PublicationList extends React.Component {
render() {
let publications = this.props.publications;
let authors = this.props.authors;
return (
<div>
{ Object.keys(publications).map((publication_id) => {
return <Publication publication={publications[publication_id]} authors=authors />;
}
</div>
);
}
}
...
Giả AuthorList
có một loạt các con Author
thành phần, và PublicationList
có một loạt các con Publication
thành phần mà làm cho nội dung thực tế của những điều đó.
Đây là câu hỏi của tôi: Giả sử tôi muốn cập nhật bio
cho một tác giả nào đó, nhưng tôi không muốn render()
được gọi cho tất cả các đối tượng Author
và Publication
có nội dung không thay đổi.
Từ câu trả lời này:
ReactJS - Does render get called any time "setState" is called?
Một Phản ứng chức năng thành phần của render()
sẽ được gọi bất cứ lúc nào trạng thái của nó, hoặc tình trạng của bất kỳ cha mẹ của nó, thay đổi - dù rằng sự thay đổi trạng thái có bất cứ điều gì để làm với các đạo cụ của thành phần đó. Hành vi này có thể được thay đổi với shouldComponentUpdate.
Cách mọi người xử lý trạng thái phức tạp như trên - có vẻ như gọi hàm render() trên số lượng lớn các thành phần trên mọi thay đổi trạng thái là một giải pháp tốt (ngay cả khi đối tượng được hiển thị là giống nhau và không thay đổi xảy ra với DOM thực tế).
Hmm ... không chắc chắn lý do tại sao bạn sẽ đặt câu trả lời cho câu hỏi của bạn, thực tế giống như những gì tôi đã nói. – jpdelatorre
Vì hai câu trả lời này không giống nhau. Kết quả của bạn trong tất cả các tác giả trẻ em của AuthorList được tái rendered bất cứ khi nào trạng thái của bất cứ điều gì trong state.authors thay đổi. Tôi chọn lọc lại chỉ hiển thị các trẻ em của AuthorList đã thay đổi nội dung, đó là những gì tôi đã cố gắng để làm. – deadcode