Reactjs фильтрует состояние по ключу и значению

#javascript #arrays #reactjs #state

#javascript #массивы #reactjs #состояние

Вопрос:

Здесь реагирует новичок.

Я пытаюсь сопоставить значение определенного идентификатора, расположенного в моем состоянии, чтобы я мог изменить некоторое значение перед обновлением базы данных через мой api.

Состояние является

 state = {
library: []
}
  

и затем, когда axios изменяет состояние, массив выглядит примерно так:

 0:{_id:"", time:"", value:""},
2:{_id:"", time:"", value:""}
  

Когда я запускаю console.log, он читает это следующим образом.

 (2) [{…}, {…}]0: {_id: "5c82803ad634ea0bebfb3eff", time: "2019-03-08T14:46:18.663Z", value:""}1: {_id: "5c827fb9d634ea0bebfb3efe", time: "2019-03-08T14:44:09.818Z", value:""}
  

Итак, в основном, когда я ввожу определенное поле ввода, обозначенное его _id, мне нужно обновить состояние значения этого конкретного состояния.

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

 updateRead = (_id, event) => {
    console.log(_id);
    console.log(event.target.value)
    this.setState(?????)
};
  

Помощь была бы высоко оценена!

Приветствия

Ответ №1:

Вы можете использовать map метод array для library массива в вашем состоянии и просто возвращать элементы как есть, если _id они не совпадают, и обновлять, value если _id они совпадают.

 updateRead = (_id, event) => {
  const { value } = event.target;

  this.setState(prevState => ({
    library: prevState.library.map(read => {
      if (read._id !== _id) {
        return read;
      }
      return {
        ...read,
        value
      };
    })
  }));
};
  

Комментарии:

1. Вау , поговорим о подобном коде в ответах. 🙂 (Я полагаю, что существует не так много способов сделать это.) Я все равно оставлю свой ответ из-за объяснений, но это действительно забавно.

Ответ №2:

Два фундаментальных правила определения состояния в React::

Кроме того, вы не можете получить доступ к свойствам синтетического события после возврата обработчика события, поэтому вам захочется получить значение перед вызовом setState (поскольку вызов вашего обратного вызова будет асинхронным).

В рамках обратного вызова вы копируете массив, находите соответствующий объект, копируете его и устанавливаете значение.

Итак:

 updateRead = (_id, event) => {
    const {value} = event.target;
    this.setState(({library}) => ({
        library: library.map(entry => entry._id === _id ? {...entry, value} : entry)
    }));
};
  

map создает новый массив из записей предыдущего массива. Обратный вызов возвращает новый объект, если идентификаторы совпадают (с использованием обозначения распространения свойств) с обновленным value или исходным объектом (поскольку нам не нужно копировать объекты, которые мы не изменяем).