Вспомогательный помощник: найти объект в массиве объектов → установить значение в свойстве [дубликат]

29
задан Alex Black 24 January 2015 в 08:09
поделиться

4 ответа

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

Вот мое решение, используя immutability-helper :

jsFiddle: http: // jsfiddle.net/eLmwf14a/

  var update = require('immutability-helper');

  handleCommentEdit: function(id, text) {
    var data = this.state.data;
    var commentIndex = data.findIndex(function(c) { 
        return c.id == id; 
    });

    var updatedComment = update(data[commentIndex], {text: {$set: text}}); 

    var newData = update(data, {
        $splice: [[commentIndex, 1, updatedComment]]
    });
    this.setState({data: newData});
  },

Следующие вопросы о массивах состояний также могут помочь:

28
ответ дан Community 26 August 2018 в 13:30
поделиться

Попытка очистить / объяснить лучше, как это сделать И что происходит.

  • Сначала найдите индекс элемента, который вы заменяете в массиве состояний.
  • Во-вторых, update элемент в этом индексе
  • В-третьих, вызовите setState с новой коллекцией
import update from 'immutability-helper';

// this.state = { employees: [{id: 1, name: 'Obama'}, {id: 2, name: 'Trump'}] } 

updateEmployee(employee) {
    const index = this.state.employees.findIndex((emp) => emp.id === employee.id);
    const updatedEmployees = update(this.state.employees, {$splice: [[index, 1, employee]]});  // array.splice(start, deleteCount, item1)
    this.setState({employees: updatedEmployees});
}
1
ответ дан daino3 26 August 2018 в 13:30
поделиться

Мне очень нравится делать это с Object.assign, а не с помощниками неизменяемости.

handleCommentEdit: function(id, text) {
    this.setState({
      data: this.state.data.map(el => (el.id === id ? Object.assign({}, el, { text }) : el))
    });
}

Я просто считаю, что это намного более сжато, чем сращивание, и не требует знания индекса или явной обработки не найден случай.

11
ответ дан Luke McGregor 26 August 2018 в 13:30
поделиться

Когда вы работаете с массивом, вам нужно передать пользовательский атрибут, в моем примере я передаю атрибут data-index, data- является префиксом, когда вы передаете собственный атрибут, это также соглашение html 5, это то же самое как мы обновляем array в Reducer.

Пример:

//handleChange method
handleChange(e){

  //getting custom attribute value.
  let i = e.target.getAttribute('data-index'),
      obj = Object.assign({}, this.state.arr[i],{[e.target.name]: e.target.value});
      
  //update state value.
  this.setState({arr: [...this.state.arr.slice(0, i),   obj, ...this.state.arr.slice(i + 1)]})
  }

1
ответ дан Umair Ahmed 26 August 2018 в 13:30
поделиться
Другие вопросы по тегам:

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