arrays - 如何处理错误:对象作为 React 子对象无效?
问题描述
我有一个显示名称属性的对象数组。我成功地完成了映射,然后按字母顺序对名称列表进行了排序。然后我尝试通过输入输入来添加搜索栏和过滤器/搜索,但是我不知道如何解决这个错误,因为我对嵌套方法和括号有点困惑。(这里是新手!)
有人可以发现问题所在吗?不确定是否需要我的代码的第二部分,但还是添加了它。对不起,它变得太长了。
未处理的拒绝(错误):对象作为 React 子项无效(发现:对象的键为 {id、name、username、email、address、phone、website、company})。如果您打算渲染一组子项,请改用数组。
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
为 false,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>
))}
推荐阅读
- authentication - Hazelcast NTLM 身份验证
- javascript - 如何在“纯”JS中选择没有父类的元素?
- mysql - MySql在数据库中迭代
- sql - 如何结合 BigQuery LAST_VALUE() 和 ARRAY_AGG()
- javascript - 调整 iframe 的大小以适应内容?
- python-3.x - 请求 Python,如何美化这段代码并做些什么?
- docker - 基于图像标签或图像摘要的 OpenShift 回滚?
- typescript - 可以使用枚举来键入数组
- python - ModuleNotFoundError:在heroku上运行时,django中没有名为'name_of_project'的模块
- python - 使用 python 和使用循环或 if 命令进行 Web 抓取