Реагировать: .map - это не функция

Так что я довольно новичок в реакции, и большую часть моего обучения я получил, наблюдая за учебником. Итак, на этом этапе я отвлекся от своего инструктора и начал реализовывать его, используя свое собственное понимание, а затем я получил следующую ошибку

React: .map is not a function

Вот код

render() {

    let person = null;

    if (this.state.showPerson) {
      person= (
        <div>
          {
            this.state.person.map((el, index) => {
              return <Person
              key = {el.id}
              click = {this.deletePersonHandler.bind(index)}
              name = {el.name}
              age = {el.age}
              changed = {(event) => this.eventSwitchHandler(event, el.id)} />
            })
          }
       </div>
     );
    }
    return (

Ошибка произошла после того, как я реализовал eventSwitchHandler, вот мой код обработчика переключателя

eventSwitchHandler = (event, id) => {

  const personInput = this.state.person.find(checkID);

  function checkID (passedID) {
     return passedID.id === id
    }
    console.info("newP")
    const newP = {...personInput}
    console.info(newP)
    newP.name = event.target.value
    console.info(personInput)
    this.setState ({person: newP})
  }

[Обновлено] Вот состояние

state = {
    person: [
    {id: "name1n", name: "Rohit", age: 24},
    {id: "name2l", name: "Hariom", age: 23},
    {id: "name3g", name: "Vaibhav", age: 58}
  ],
  someOtherState: "Untouched state",
  showPerson: false
}

[Обновить] Вот мой код инструктора. Его обработчик изменения имени совпадает с моим eventSwitchHandler.

Реагировать: .map - это не функция Опять же, мой первый вопрос был бы в том, почему возникает ошибка .map is not a function, и во время работы с console.infoging я заметил кое-что, что для меня довольно редко, для чего я прикрепил снимок экрана (почему кажется, что имя в обоих местах разное?)

Реагировать: .map - это не функция

Человек - это объект, а не массив, думаю, поэтому метод map не работает. Вы можете найти это полезным: stackoverflow.com/questions/14810506/… Ошибка на скриншоте действительно странная.

Dmitriy Gamolin 12.04.2018 07:08

Человек - это массив, только что обновил мой вопрос. Все работало нормально, пока я не использовал eventSwitchHandler

user9504869 12.04.2018 07:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
2
11 338
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ваш человек выглядит как объект javascript, а не массив, который предоставляет функцию карты.

Вы можете ознакомиться с остальной информацией в документации здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Человек - это массив, только что обновил мой вопрос. Все работало нормально, пока я не использовал eventSwitchHandler

user9504869 12.04.2018 07:27

Нет, человек выглядит как объект. Обратите внимание на разницу в декларациях между человеком и людьми.

Gerik 12.04.2018 07:49

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

Object.keys(this.state.person).map((key, index) => {
    console.info(this.state.person[key]);
})

Обновлять

Вы сделали разные вещи со своим кодом инструктора:

eventSwitchHandler = (event, id) => {
    const personInput = this.state.person.find(checkID);

    function checkID (passedID) {
       return passedID.id === id
    }

    const newP = {...personInput}   // **** newP is an object. ****
    newP.name = event.target.value
    // What you missed:
    // let person = this.state.person;
    // person[personInput] = newP;
    // this.setState ({person: person});

    this.setState ({person: newP})  // **** now person becomes object, not an array any more. ****
}

Человек - это массив, только что обновил мой вопрос. Все работало нормально, пока я не использовал eventSwitchHandler

user9504869 12.04.2018 07:27

@RahulPatel, мы находим проблему.

Carr 12.04.2018 07:52
Ответ принят как подходящий

Вы неправильно обновляете состояние в eventSwitchHandler

eventSwitchHandler = (event, id) => {

  const personInput = this.state.person.find(checkID);

    function checkID (passedID) {
     return passedID.id === id
    }
    console.info("newP")
    const newP = {...personInput}  // newP is an object here
    console.info(newP)
    newP.name = event.target.value
    console.info(personInput)
    this.setState ({person: newP}) // overwriting person array with object
}

Вы бы изменили это на

eventSwitchHandler = (event, id) => {
    const personInputIndex = this.state.person.findIndex(checkID);

    function checkID (passedID) {
     return passedID.id === id
    }
    const newName = event.target.value
    this.setState (prevState => ({
            person: [
                ...prevState.person.slice(0, personInputIndex), 
                {...prevState.person[personInputIndex], name: newName},
                ...prevState.person.slice(personInputIndex)
            ]
       })
    ) 
}

или же

eventSwitchHandler = (event, id) => {
    const personInputIndex = this.state.person.findIndex(checkID);

    function checkID (passedID) {
     return passedID.id === id
    }
    const newName = event.target.value
    this.setState (prevState => ({
            person: Object.assign([], prevState.person, {
               [personInputIndex]: {...prevState.person[personInputIndex], newName
            }})
       })
    ) 
}

Шубхам, это помогает, но я очень хочу знать, как я могу этого добиться, используя вместо этого ID? Поскольку индекс элемента изменяется, а идентификатор - нет.

user9504869 12.04.2018 17:34

@RahulPatel, мы находим индекс по id, верно?

Shubham Khatri 12.04.2018 18:08
    eventSwitchHandler = (event, id) => {

  const personInput = this.state.person.findIndex(checkID);

  function checkID (passedID) {
     return passedID.id === id;
    }
    const person = {...this.state.person[personInput]};
    person.name = e.target.value;
    const newPerson =[...this.state.person];
    newPerson[personInput] = person;
    this.setState ({person: newPerson})
  }

Другие вопросы по теме