В соответствии с вашим запросом в комментариях приведено краткое объяснение этого кода:
nameChangedHandler = (e, id ) => {
const personIndex = this.state.persons.findIndex(p=> {
return p.id === id;
})
То, что вы видите, это функция стрелки .В целях всего этого ответа рассматривайте их как нормальную функцию (это не то же самое, однако это можно сделать и с обычными функциями).Семантически говоря, функции стрелок или обычные функции не меняют то, что делает код / его намерения, поэтому я не буду вдаваться в подробности, вы просто должны знать, что вы видите.Если вы не знакомы с ними, вы должны прочитать об этом, они очень полезны.Подпись для функции стрелки: (a,b) => {}
, a => {}
или a => <expression>
.Таким образом, грубо говоря, вышеприведенное можно логически интерпретировать как function(e,id){}
и function(p){}
, просто чтобы прояснить это до того, как я продолжу (это не сработает, если будет написано таким образом, но это сообщение, которое оно передает).Сам код извлекает индекс человека, который соответствует параметру id
, который вы передали nameChangeHandler.Это делается с помощью findIndex , функции, которая перебирает массив (в данном случае массив .persons
вашего состояния) и возвращает индекс первого элемента, который проходит заданную тестовую функцию.Этот индекс затем сохраняется внутри переменной для последующего использования в коде.
Значения
e
и id
получены в результате вызова самой функции, я не могу дать вам большеподробно, так как я не вижу, что такое класс <Person>
, но можно с уверенностью предположить, что этот обработчик присоединяется к полю ввода.Как только изменение произойдет с помощью обработчика onChange
в поле ввода, реагирование вызовет обработчик и передаст ему event
, содержащий данные события.Ваш обработчик на самом деле не функция nameChangeHandler
, это функция стрелки, которая принимает event e
, а затем вызывает nameChangeHandler
, передавая как event e
, так и id
для человека, вы можете видетьчто здесь changed={(e)=>this.nameChangedHandler(e, person.id)}
.Остальные значения считываются из вашего state
.
Давайте продолжим с кодом:
const person = {
...this.state.persons[personIndex]
};
То, что мы здесь имеем, называется распространения .По сути, он «распаковывает и перепаковывает» объект или массив, вы можете узнать больше об этом по данной ссылке MDN.Это новая мощная функция ES6, которая делает жизнь намного проще.
Таким образом, приведенный выше код используется для умного поверхностного копирования объекта персонажа из массива в новую локальную переменную (или, скорее, const
, поскольку переменная подразумевает возможность изменения)Мы делаем это потому, что в javascript данные объекта хранятся по ссылке, поэтому мы не можем просто изменить объект person внутри исходного массива, который бы изменял состояние.Мы не хотим мутировать государство.Ключ неизменен.
person.name= e.target.value;
После этого у нас простое назначение.Новый объект person
, который мы только что создали, является точной (своего рода) копией того, кем был человек внутри массива .persons
государства, и это нехорошо, мы хотим изменить имя, поэтому мы делаем именно это.Мы получаем доступ к event e
и читаем value
из target
, который его вызвал, назначаем новое значение нашему person
объекту, и теперь у нас есть «измененный человек» (каламбур предназначен).
Нам осталось только перенести эти изменения в состояние, чтобы новый рендер мог их показать, поэтому мы делаем:
const persons = [...this.state.persons];
persons[personIndex] = person;
Этот код снова использует распространение клонировать / копировать старый массив из состояния в новый локальный массив person.Это эквивалентно использованию const persons = this.state.persons.slice()
.Вы можете прочитать больше о .slice()
на MDN (намеренно не оставляя прямой ссылки для вас, чтобы вы ее искали и изучали эту часть, MDN действительно отличный источник для документации всех видови знакомство с этим сайтом - спасение жизни.)Наконец, после того, как массив клонирован, мы находим оригинального человека и заменяем его на локальный объект персоны, у которого есть измененное имя.
this.setState({
persons: persons
})
Наконец, мы используем метод .setState
, который реагирует (см. документация ) для неизменного изменения состояния.Это изменение вызовет новый render()
, и вы сможете увидеть изменения в пользовательском интерфейсе.Сам .setState()
работает, выполняя поверхностное слияние .Это означает, что только свойства, которые вы передаете самому методу, будут изменены / добавлены в состояние, остальные свойства будут сохранены, как есть.Поскольку единственное, что мы передаем, это другой массив persons
, который является нашим локальным массивом, с измененным человеком, это единственное, что изменяется.