编辑:我重写了这个问题,以澄清我后 - 谢谢你的回应迄今为止帮助我磨练它的人。在React中管理嵌套状态的好方法
我想了解如何在React中最好地管理复杂的嵌套状态,同时还限制内容未发生更改的组件的调用次数render()
。
作为背景:
假设我有状态,在这样一个对象都“作者”和“出版物”:
{
'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...
}
}
在这个人为的例子国家主要有两个方面,通过访问authors
和publications
键。
authors
键导致键入作者ID的对象,这会导致包含某些作者数据的对象。
publications
键导致在具有一些发布数据的发布的ID和作者数组上键入的对象。
假设我的状态是一个App
组件通过类似以下的伪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>
);
}
}
...
假设AuthorList
有一堆孩子Author
组件,并PublicationList
有一堆孩子Publication
组件,这些组件使这些东西的实际内容。
这里是我的问题:假设我想更新bio
对于给定的作家,但我不希望render()
被称为所有Author
和Publication
对象,其内容并没有改变。
从这样的回答:
ReactJS - Does render get called any time "setState" is called?
一个阵营组件的render()
功能将被调用任何时候的状态,或任何其母公司,变化的状态 - 无论该状态变化是否有什么使用该组件的道具。这个行为可以用shouldComponentUpdate来改变。
人们如何处理像上面这样复杂的状态 - 它看起来好像在每个状态上调用大量组件的render()方法都是一个很好的解决方案(即使生成的渲染对象是相同的并且没有变化发生在实际的DOM上)。
嗯...不知道为什么你会回答你的问题,这与我所说的几乎相同。 – jpdelatorre
因为这两个答案实际上并不相同。您的结果是每当State.authors中的任何状态发生更改时,AuthorList的所有Author子级都会重新呈现。我有选择地重新渲染只改变了内容的AuthorList的孩子,这正是我想要做的。 – deadcode