удаление индекса из массива объектов вact.js всегда удаляет последний индекс

Для получения 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;
    }
}
0
задан user2032522 1 March 2019 в 02:00
поделиться

2 ответа

Проблема, я полагаю, заключается в использовании индекса карты в качестве ключа. Вы можете иметь свойство индекса в каждом элементе.

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

0
ответ дан Shrijit Pandey 1 March 2019 в 02:00
поделиться

При добавлении строки вы устанавливаете начальные значения в качестве элементов ввода. Чем при удалении вы смотрите в массиве индекс объекта, содержащего входные элементы. Функция indexOf возвращает первый индекс вхождения.

Лучшее решение - обновить кнопку удаления, чтобы передать индекс удаляемого элемента

            <th><button onClick={() => this.delete(index)}

Чем просто удалить элемент с указанным индексом в вашей функции.

delete = (index) => {
    let datas = this.state.datas.filter((e, i) => i !== index);
    this.setState({ datas : datas });
  }

Но это все еще не полностью исправит ваше решение, потому что вы устанавливаете новый элемент массива для хранения входных элементов. Что вы не должны.

0
ответ дан chriss 1 March 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: