我的工作,对最新动态web应用程序和我的一些代码: MainContainer.js
:关于react.js条件渲染,或者react.js中的潜在错误?
renderContent(source) {
let content;
switch (source) {
case 'bbc':
case 'cnn':
case 'reuters':
content = <Guide source={source}/>;
break;
case 'medium':
content=null;
break;
default:
content = null;
break;
}
return content;
}
render() {
let {source} = this.props;
return this.renderContent(source);
}
这是代码MainContainer
,这是一个容器组件来呈现来自CNN,BBC或不同的新闻。它的包装部件App
App.js render()
<div>
<ScrollableTab sources={sources} handleChange={this.handleSwitchTag.bind(this)} current={current}/>
<MainContainer source={sources[current].toLowerCase()}/>
</div>
当用户点击ScrollableTab
一些选项卡中,MainContainer
变化source
财产,这将导致不同的Guide
渲染。(一些记录后,source
没有变化在MainContainer
)。
但是,此失败,Guide
未能卸下。只有当用户点击Medium
这种情况下renderContent()
返回null可以Guide
umount。
我想,这可能是因为React.js无法提取类似的组件并进行一些优化,它认为不需要卸载实际上是不同的“相同”组件。
所以,我想补充key=
在renderContent
,我的意思是:
renderContent(source) {
let content;
switch (source) {
case 'bbc':
case 'cnn':
case 'reuters':
content = <Guide key={source} source={source}/>;
break;
case 'medium':
content=null;
break;
default:
content = null;
break;
}
return content;
}
render() {
let {source} = this.props;
return this.renderContent(source);
}
这样一来,它的工作原理。但是我在React.js的文档中找不到任何解释。 或者我错过了一些文档。有人告诉我这是一个bug还是只是过度优化?
文档中的相关部分:https://facebook.github.io/react/docs/lists-and-keys.html,https://facebook.github.io/react/docs/reconciliation.html。尤其是:*“键帮助React识别哪些项目已更改,添加或删除。”* –