【发布时间】:2015-02-16 11:44:32
【问题描述】:
我在删除 React 数组中的有状态元素时遇到问题。在下面的例子中,如果你点击第二个元素('B')上的'toggle',你会看到:
条目 id:0 名称:A 是活动切换删除
条目 ID:1 名称:B 未激活切换删除
条目 id:2 名称:C 是活动切换删除
如果您现在在第一个元素 ('A') 上单击“删除”:
条目 id:0 名称:B 是活动切换删除
条目 id:1 名称:C 未激活切换删除
B 发生了变化,但我想做的只是删除 A 而不会影响任何其他元素。根据文档,我有一个key,并尝试使用带有字符串前缀的键,但没有帮助。
有没有办法做到这一点而不将状态推送到TestContainer? (在我的实际情况中,我有很多不同类型的不同元素)。
<div id="test"></div>
<script type="text/jsx">
var TestLine = React.createClass({
getInitialState: function() {
return {active: true};
},
handleLineRemove: function(e) {
this.props.processLineRemove(this.props.id);
},
toggleActive: function(e) {
this.setState({active: !this.state.active};
},
render: function() {
return (
<p>
Entry id: {this.props.id} name: {this.props.name}
{this.state.active ? " Is Active " : " Is Not Active " }
<a onClick={this.toggleActive}>Toggle</a>
<a onClick={this.handleLineRemove}>Remove</a>
</p>
);
}
});
var TestContainer = React.createClass({
getInitialState: function() {
return {data: {lines: ['A','B','C']}};
},
processLineRemove: function(index) {
var new_lines = this.state.data.lines.slice(0);
new_lines.splice(index,1);
var newState = React.addons.update(this.state.data, {
lines: {$set: new_lines}
});
this.setState({data: newState});
},
render: function() {
var body =[];
for (var i = 0; i < this.state.data.lines.length; i++) {
body.push(<TestLine
key={i}
id={i}
name={this.state.data.lines[i]}
processLineRemove={this.processLineRemove} />)
}
return (
<div>{body}</div>
);
}
});
React.render(<TestContainer />, document.getElementById('test'));
</script>
【问题讨论】:
-
总是需要某个集中位置来通知删除。您可以使用操作/调度程序来通知更改并将其传播回来,但从概念上讲,它与您现有的实现没有太大区别,如图所示。您需要通知拥有数据的任何组件或商店。
-
元素正在通过拥有该数组的 TestContainer 成功删除。但是,剩余的数组元素没有正确重新渲染;只是名称标签正在移动,并且 TestLine 中的私有状态没有“移动”到数组中的新位置。
-
那么您要问两个问题——如何在不涉及
TestContainer的情况下管理状态以及如何正确重新渲染。看起来答案应该对您有所帮助。
标签: javascript reactjs