How to handle Error: Objects are not valid as React child?
How to handle Error: Objects are not valid as React child?
我有一组显示名称 属性 的对象。我成功地进行了映射,然后按字母顺序对名称列表进行了排序。然后我尝试通过输入输入来添加搜索栏和 filter/search,但出现了这个错误,我不知道如何解决,因为我对嵌套方法和括号有点困惑。 (这里是新手!)
有人能找出问题所在吗?不确定是否需要我的代码的第二部分,但还是添加了它。对不起,它太长了。
未处理的拒绝(错误):对象作为 React 子项无效(已找到:具有键 {id、名称、用户名、电子邮件、地址、phone、网站、公司} 的对象)。如果您打算渲染一组子项,请改用数组。
const UserList = () => {
const [users, setUsers] = useState([])
const [selectedUser, setSelectedUser] = useState()
const [showUser, setShowUser] = useState(true)
const [search, setNewSearch] = useState("")
const onHandleClick = () => setShowUser(false)
const DisplayUser =(user) => {
setSelectedUser(user)
setShowUser(true)
}
const handleSearchChange = (e) => {
setNewSearch(e.target.value)
}
useEffect(() => {
fetch(URL)
.then(res => res.json())
.then(json => setUsers(json));
}, [])
return (
<>
<Header>
<h1>Contact list</h1>
</Header>
<input type="text" value={search} onChange={handleSearchChange} />
<Container>
<div>
{!search
? users.sort((a,b) => a.name.localeCompare(b.name))
: users.filter(user => user.name.toLowerCase().includes(search.toLowerCase()))
.map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
</div>
第二部分:
{selectedUser && (
<>
{showUser ?
<UserDetail
name={selectedUser.name}
username={selectedUser.username}
email={selectedUser.email}
address={selectedUser.address.street}
address2={selectedUser.address.suite}
city={selectedUser.address.city}
phone={selectedUser.phone}
website={selectedUser.website}
company={selectedUser.company.name}
onClick={onHandleClick}
/>
: false}
</>
)}
</Container>
</>
)
}
我很难确定,但我认为可能发生的情况如下:
{!search
? users.sort((a,b) => a.name.localeCompare(b.name))
: users.filter(user => user.name.toLowerCase().includes(search.toLowerCase()))
.map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
如果 search
为假,这将 return users.sort((a,b) => a.name.localeCompare(b.name))
,这是一个对象,当您打算将 .map
应用于整个三元的结果时手术。现在 .map
仅附加到 users.filter(...)
部分。
我希望“排序或筛选”周围的括号会起作用,从那时起它会 map
在任何一种情况下,而不仅仅是“其他”情况。
{(!search
? users.sort((a,b) => a.name.localeCompare(b.name))
: users.filter(user => user.name.toLowerCase().includes(search.toLowerCase())))
.map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
由于这样的代码很难理解,我强烈建议将这样的逻辑提取到一个函数中,比如 getUser()
,这样您就可以改为这样做:
{getUsers().map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
我有一组显示名称 属性 的对象。我成功地进行了映射,然后按字母顺序对名称列表进行了排序。然后我尝试通过输入输入来添加搜索栏和 filter/search,但出现了这个错误,我不知道如何解决,因为我对嵌套方法和括号有点困惑。 (这里是新手!)
有人能找出问题所在吗?不确定是否需要我的代码的第二部分,但还是添加了它。对不起,它太长了。
未处理的拒绝(错误):对象作为 React 子项无效(已找到:具有键 {id、名称、用户名、电子邮件、地址、phone、网站、公司} 的对象)。如果您打算渲染一组子项,请改用数组。
const UserList = () => {
const [users, setUsers] = useState([])
const [selectedUser, setSelectedUser] = useState()
const [showUser, setShowUser] = useState(true)
const [search, setNewSearch] = useState("")
const onHandleClick = () => setShowUser(false)
const DisplayUser =(user) => {
setSelectedUser(user)
setShowUser(true)
}
const handleSearchChange = (e) => {
setNewSearch(e.target.value)
}
useEffect(() => {
fetch(URL)
.then(res => res.json())
.then(json => setUsers(json));
}, [])
return (
<>
<Header>
<h1>Contact list</h1>
</Header>
<input type="text" value={search} onChange={handleSearchChange} />
<Container>
<div>
{!search
? users.sort((a,b) => a.name.localeCompare(b.name))
: users.filter(user => user.name.toLowerCase().includes(search.toLowerCase()))
.map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
</div>
第二部分:
{selectedUser && (
<>
{showUser ?
<UserDetail
name={selectedUser.name}
username={selectedUser.username}
email={selectedUser.email}
address={selectedUser.address.street}
address2={selectedUser.address.suite}
city={selectedUser.address.city}
phone={selectedUser.phone}
website={selectedUser.website}
company={selectedUser.company.name}
onClick={onHandleClick}
/>
: false}
</>
)}
</Container>
</>
)
}
我很难确定,但我认为可能发生的情况如下:
{!search
? users.sort((a,b) => a.name.localeCompare(b.name))
: users.filter(user => user.name.toLowerCase().includes(search.toLowerCase()))
.map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
如果 search
为假,这将 return users.sort((a,b) => a.name.localeCompare(b.name))
,这是一个对象,当您打算将 .map
应用于整个三元的结果时手术。现在 .map
仅附加到 users.filter(...)
部分。
我希望“排序或筛选”周围的括号会起作用,从那时起它会 map
在任何一种情况下,而不仅仅是“其他”情况。
{(!search
? users.sort((a,b) => a.name.localeCompare(b.name))
: users.filter(user => user.name.toLowerCase().includes(search.toLowerCase())))
.map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}
由于这样的代码很难理解,我强烈建议将这样的逻辑提取到一个函数中,比如 getUser()
,这样您就可以改为这样做:
{getUsers().map(user => (
<div key={user.id}>
<User onClick ={() => DisplayUser(user)}>{user.name}</User>
</div>
))}