Having this code with one parent component (app) and two children (Inputs, List). Inputs
is for writing data, a callback from parent is saving it to a people
array which writes that data in List
component.
My question is, why do it requires people.people.map(...)
instead of people.map(...)
? And how can it be fixed that.
import React from 'react';
import './App.css';
import Inputs from './components/Inputs';
import List from './components/List';
import { useState } from 'react';
function App() {
const [person, setPerson] = useState({ name: '', email: '' });
const [people, setPeople] = useState([]);
const callback = (e) => {
setPeople((people) => [...people, person]);
};
return (
<div>
<Inputs callback={callback} person={person} setPerson={setPerson} />
<List people={people} />
</div>
);
}
export default App;
Inputs:
const Inputs = ({ person, setPerson, callback }) => {
const updateName = (e) => {
setPerson((person) => ({ ...person, name: e.target.value }));
};
const updateEmail = (e) => {
setPerson((person) => ({ ...person, email: e.target.value }));
};
return (
<div>
<label>name:</label>
<input onChange={updateName}></input>
<label>email:</label>
<input onChange={updateEmail}></input>
<button onClick={() => callback(person)}>add person</button>
</div>
);
};
export default Inputs;
List:
const List = (people) => {
return (
<div>
{people.people.map((p) => ( // <---- HERE
<div>
<span>{p.name}</span>
<span>{p.email}</span>
</div>
))}
</div>
);
};
export default List;
CodePudding user response:
Because you name props to people
in List
component
You may change like this
const List = (props) => {
return (
<div>
{props.people.map((p) => ( // <---- HERE
<div>
<span>{p.name}</span>
<span>{p.email}</span>
</div>
))}
</div>
);
};
export default List;
or this
const List = ({people}) => {
return (
<div>
{people.map((p) => ( // <---- HERE
<div>
<span>{p.name}</span>
<span>{p.email}</span>
</div>
))}
</div>
);
};
export default List;