在以下示例中,Item 2单击时,Second 1将显示而不是Second 2.为什么?你会如何解决这个问题?
var guid = 0;
class Content extends React.Component {
constructor() {
guid += 1;
this.id = guid;
console.log('ctor', this.id); // called only once with 1
}
render() {
return (
<div className="content">
{this.props.title} - {this.id}
</div>
);
}
}
class MyApp extends React.Component {
constructor() {
this.items = ['Item 1', 'Item 2'];
this.state = {
activeItem: this.items[0]
};
}
onItemClick(item) {
this.setState({
activeItem: item
});
}
renderMenu() {
return (
<div className="menu">
<div onClick={this.onItemClick.bind(this, 'Item 1')}>Item 1</div>
<div onClick={this.onItemClick.bind(this, 'Item 2')}>Item 2</div>
</div>
);
}
renderContent() {
if (this.state.activeItem === 'Item 1') {
return (
<Content title="First" />
);
} else {
return (
<Content title="Second" />
);
}
}
render() {
return (
<div>
{this.renderMenu()}
{this.renderContent()}
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*nan 100
React的协调算法假设没有任何相反的信息,如果自定义组件出现在后续渲染的相同位置,则它与之前的组件相同,因此重用前一个实例而不是创建新实例.
如果你要实现componentWillReceiveProps(nextProps),你会看到被调用.
不同的节点类型
<Header>元素不太可能生成一个看起来像生成的DOM的DOM<Content>.React不是花时间尝试匹配这两个结构,而是从头开始重新构建树.作为推论,如果
<Header>在两个连续渲染中存在相同位置的元素,您可能会看到非常相似的结构,值得探索它.自定义组件
我们决定两个自定义组件是相同的.由于组件是有状态的,我们不能只使用新组件并将其称为一天.React从新组件中获取所有属性,并调用
component[Will/Did]ReceiveProps()前一个组件.之前的组件现已投入使用.
render()调用其方法,并使用新结果和先前结果重新启动diff算法.
如果为每个组件提供唯一的key支持,React可以使用该key更改来推断组件实际已被替换,并将从头开始创建一个新组件,从而为其提供完整的组件生命周期.
renderContent() {
if (this.state.activeItem === 'Item 1') {
return (
<Content title="First" key="first" />
);
} else {
return (
<Content title="Second" key="second" />
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27720 次 |
| 最近记录: |