Реакция: Предупреждение: React.createElement: тип недействителен

Так что я просто начал с реакции и просматривал одно из видео о «Обработке динамического контента в реакции»).

Итак, наша основная цель - отображать три окна с помощью функции карты, когда мы нажимаем кнопку.

Изначально мы создали такой объект состояния

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

А потом мы попробовали что-то подобное для условного и сопоставления

 render() {

    let person = null;

    if (this.state.showPerson) {
      person = (
        <div>
          {this.state.person.map(Person => {
            return <Person
            name = {Person.name}
            age = {Person.age} />
          })}
          </div>
     );
    }

Затем следует это

return (

  <div className = "App">
        <h1> Hi I am react App</h1>
        <button onClick = {this.togglerPersonHandler}>Button</button>
        {person}
    </div>
      );
   }
}

Теперь, когда я нажимаю кнопку, она выдает следующую ошибку (три раза)

index.js:2178 Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: object.

Check your code at App.js:54.
    in App (at index.js:7)

а также

index.js:2178 The above error occurred in the <div> component:
    in div (at App.js:52)
    in div (at App.js:63)
    in App (at index.js:7)

Consider adding an error boundary to your tree to customize error handling behavior.

Что я здесь делаю не так? (THe togglerPersonHandler просто изменяет значение someOtherState). Сообщите мне мою ошибку и исправьте.

Можете выложить код для метода togglerPersonHandler()?

Tom O. 11.04.2018 19:31
Поведение ключевого слова "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) для оценки ваших знаний,...
1
1
194
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в этой части:

{this.state.person.map(Person => { return <Person .....})

Не забывайте, что мы пишем jsx, что является синтаксическим сахаром, он будет преобразован в:

React.createElement(type, props, children)

Тип должен быть либо строкой для тегов html, либо компонентом реакции.

Итак, в вашем случае вы используете Person в качестве аргумента функции стрелки, что означает, что ее значением будет каждый объект массива this.state.persons. В то же время вы визуализируете <Person />, а Person является объектом, а не допустимым типом, поэтому вы получаете сообщение об ошибке:

React.createElement: type is invalid

Решением будет, если (Person - это компонент реакции, который вы где-то определили), используйте другое имя:

<div>
    {
        this.state.person.map(el => (
            <Person
                key = {el.name}
                name = {el.name}
                age = {el.age} />
            )
        )
    }
</div>

Также назначьте уникальный ключ каждому элементу.

Эй, это решает мою проблему. У меня есть еще один вопрос. Если я сделаю что-то вроде этого `this.state.person.map (el => {, это не сработает, но когда я сделаю что-то вроде этого 'this.state.person.map (el => ( "Это работает. Я знаю, что мне что-то не хватает, Не могли бы вы также сказать разницу?"

user9504869 11.04.2018 21:03

извините, я не видел никаких различий, оба одинаковые, не могли бы вы объяснить больше

Mayank Shukla 11.04.2018 21:06
this.state.person.map(el => { не работает, но this.state.person.map(el => ( работает. Я вижу разницу между { и (, но можете ли вы мне сказать, почему это не работает с этим {?
user9504869 11.04.2018 21:14

Видеоурок, которому я следую, мой инструктор сделал что-то вроде этого: imgur.com/a/bIpqb

user9504869 11.04.2018 21:18

потому что это два способа использования стрелочной функции, первая - это () => {return ....} и () => (), с {} требуется возврат, а с () все, что вы напишете внутри, будет возвращено :)

Mayank Shukla 11.04.2018 21:20

Я согласен с @Mayank Shukla. Хотя более простой и менее сложный способ сделать это было бы

    render() {
    let person = this.state.person.map(per => <Person key = {per.name} name = {per.name} age = {per.age}/>);

    return (  <div className = "App">
        <h1> Hi I am react App</h1>
        <button onClick = {this.togglerPersonHandler}>Button</button>
        {this.state.showPerson ? person : ''}
    </div>);
}

}

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