Так что я просто начал с реакции и просматривал одно из видео о «Обработке динамического контента в реакции»).
Итак, наша основная цель - отображать три окна с помощью функции карты, когда мы нажимаем кнопку.
Изначально мы создали такой объект состояния
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). Сообщите мне мою ошибку и исправьте.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в этой части:
{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 => ( "Это работает. Я знаю, что мне что-то не хватает, Не могли бы вы также сказать разницу?"
извините, я не видел никаких различий, оба одинаковые, не могли бы вы объяснить больше
this.state.person.map(el => { не работает, но this.state.person.map(el => ( работает. Я вижу разницу между { и (, но можете ли вы мне сказать, почему это не работает с этим {?
Видеоурок, которому я следую, мой инструктор сделал что-то вроде этого: imgur.com/a/bIpqb
потому что это два способа использования стрелочной функции, первая - это () => {return ....} и () => (), с {} требуется возврат, а с () все, что вы напишете внутри, будет возвращено :)
Я согласен с @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>);
}
}
Можете выложить код для метода
togglerPersonHandler()?