У меня возникают проблемы с удалением элементов состояния в массиве React. В следующем примере, если нажать 'тумблер' на втором элементе ('B'), вы увидите:Удаление элемента Stateful из массива ReactJS
запись Идентификатор: 0 Имя: A активен Переключить Удалить
запись ID: 1 название: B не активен Переключить Удалить
запись идентификатор: 2 имя: C активен Переключить Удалить
Если теперь нажать кнопку 'Удалить' на первом элементе ('A'):
записи ID: 0 Имя: B активно Переключить Удалить
записи Идентификатор: 1 Имя: C не активно Переключить Удалить
B изменился, но все, что я хотел сделать, это удалить и не влияют на какие-либо другие элементы. У меня есть 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>
Там всегда должны быть некоторые централизованное местоположение, которое необходимо будет уведомлен об удалении. Вы можете использовать action/dispatcher, чтобы уведомить об этом изменении и распространить его обратно, но концептуально он не сильно отличается от вашей существующей реализации, как показано. Вам нужно будет уведомить какой-либо компонент или магазин, которому принадлежат данные. – WiredPrairie
Элементы успешно удаляются с помощью TestContainer, которому принадлежит массив. Однако оставшиеся элементы массива не будут повторно отображены правильно; только метки имен перемещаются, а частное состояние в TestLine не переводится в новую позицию в массиве. –
Теперь вы задаете два вопроса: как управлять состоянием без привлечения «TestContainer» и как правильно отображать его. Похоже, ответ должен помочь вам. – WiredPrairie