Для получения Drawable id из имени ресурса String я использую этот код:
private int getResId(String resName) {
int defId = -1;
try {
Field f = R.drawable.class.getDeclaredField(resName);
Field def = R.drawable.class.getDeclaredField("transparent_flag");
defId = def.getInt(null);
return f.getInt(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
return defId;
}
}
Проблема, я полагаю, заключается в использовании индекса карты в качестве ключа. Вы можете иметь свойство индекса в каждом элементе.
class App extends Component {
constructor(props) {
super(props);
this.state = {
datas: [
{ index:0, name: "test", value: "test" },
{ index:1, name: "test 1", value: "test 1" },
{ index:2, name: "test 2", value: "test 2" }
],
counter: 3
};
}
delete = index => {
let datas = this.state.datas.filter((e, i) => i !== index);
this.setState({ datas: datas });
};
addnew = () => {
let datas = this.state.datas;
datas.push({ index: this.state.counter, name: <input />, value: <input /> });
this.setState({ datas: datas, counter: this.state.counter + 1 });
};
render() {
return (
<div>
<button onClick={this.addnew}>Add</button>
<table>
<thead>
<tr>
<th>Name</th>
<th>Value</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{this.state.datas.map((data, index) => (
<tr key={data.index}>
<th>{data.name}</th>
<th>{data.value}</th>
<th>
<button onClick={() => this.delete(index)}>delete</button>{" "}
</th>
</tr>
))}
</tbody>
</table>
</div>
);
}
}
Изменить на CodeSandbox: https://codesandbox.io/embed/p57now4pjx?fontsize=14
При добавлении строки вы устанавливаете начальные значения в качестве элементов ввода. Чем при удалении вы смотрите в массиве индекс объекта, содержащего входные элементы. Функция indexOf возвращает первый индекс вхождения.
Лучшее решение - обновить кнопку удаления, чтобы передать индекс удаляемого элемента
<th><button onClick={() => this.delete(index)}
Чем просто удалить элемент с указанным индексом в вашей функции.
delete = (index) => {
let datas = this.state.datas.filter((e, i) => i !== index);
this.setState({ datas : datas });
}
Но это все еще не полностью исправит ваше решение, потому что вы устанавливаете новый элемент массива для хранения входных элементов. Что вы не должны.