React Typescript: TypeError: Cannot read properties of undefined (reading 'map')
React Typescript: TypeError: Cannot read properties of undefined (reading 'map')
我正在尝试使用 axios 从 jsonplaceholder 获取的用户数据映射卡片组件。但是,当我尝试时,它 returns 出现“类型错误:无法读取未定义的属性(读取 'map')”。我尝试了网络上的所有解决方案,但均未成功。
请帮忙!
这是声明 'users';
的代码
export const useAllUsers = () => {
const [users, setUsers] = useState<Array<User>>()
const getUsers = useCallback(() => {
axios
.get<Array<User>>('https://jsonplaceholder.typicode.com/users')
.then(res => {
setUsers(res.data)})
.catch(() => {
return <MessageError />
})
.finally(()=>{
setLoading(false)
})
}, [])
return { getUsers, loading, users }
}
然后,我尝试映射 'users' 获取所有用户数据,如下所示:
export const UserManagement: VFC = memo(() => {
const { getUsers, users, loading } = useAllUsers()
useEffect(() => getUsers(), [])
return (
<>
{loading ? (
<div className=' flex justify-center items-center'>
<div className='animate-spin rounded-full h-32 w-32 border-b-2 border-gray-900'></div>
</div>
) : (
<div
className='grid
grid-cols-2 mb-16 md:grid-cols-3 lg:grid-cols-4 sm:px-6 md:px-16'
>
<div className='grid mx-auto'>
{users.map(user => (
<UserCard
key={user.id}
userName={user.username}
imageUrl='https://source.unsplash.com/random'
userId={user.name}
/>
))}
</div>
</div>
)}
</>
)
})
用户类型只是用户数据的一堆类型,所以我想这不是问题,我猜?
export type User = {
id: number
name: string
username: string
email: string
hobbies: string
}
我认为您在 get
请求完成之前试图映射您的用户,所以它是未定义的。试试像
{
users &&
users.map((user) => (
<UserCard
key={user.id}
userName={user.username}
imageUrl="https://source.unsplash.com/random"
userId={user.name}
/>
));
}
您有一个 loading
“状态”来防止在获取任何数据之前尝试呈现项目,但在 useAllUsers
中您实际上从未声明 [=11=] useState
,因此在 UserManagement
中它将始终为 false,导致它在准备就绪之前尝试渲染 users
。
要修复,你可以添加缺少的加载 useState,我也建议将一个空数组作为数组类型状态的初始值,如下所示:
const [users, setUsers] = useState<Array<User>>([])
我正在尝试使用 axios 从 jsonplaceholder 获取的用户数据映射卡片组件。但是,当我尝试时,它 returns 出现“类型错误:无法读取未定义的属性(读取 'map')”。我尝试了网络上的所有解决方案,但均未成功。 请帮忙!
这是声明 'users';
的代码export const useAllUsers = () => {
const [users, setUsers] = useState<Array<User>>()
const getUsers = useCallback(() => {
axios
.get<Array<User>>('https://jsonplaceholder.typicode.com/users')
.then(res => {
setUsers(res.data)})
.catch(() => {
return <MessageError />
})
.finally(()=>{
setLoading(false)
})
}, [])
return { getUsers, loading, users }
}
然后,我尝试映射 'users' 获取所有用户数据,如下所示:
export const UserManagement: VFC = memo(() => {
const { getUsers, users, loading } = useAllUsers()
useEffect(() => getUsers(), [])
return (
<>
{loading ? (
<div className=' flex justify-center items-center'>
<div className='animate-spin rounded-full h-32 w-32 border-b-2 border-gray-900'></div>
</div>
) : (
<div
className='grid
grid-cols-2 mb-16 md:grid-cols-3 lg:grid-cols-4 sm:px-6 md:px-16'
>
<div className='grid mx-auto'>
{users.map(user => (
<UserCard
key={user.id}
userName={user.username}
imageUrl='https://source.unsplash.com/random'
userId={user.name}
/>
))}
</div>
</div>
)}
</>
)
})
用户类型只是用户数据的一堆类型,所以我想这不是问题,我猜?
export type User = {
id: number
name: string
username: string
email: string
hobbies: string
}
我认为您在 get
请求完成之前试图映射您的用户,所以它是未定义的。试试像
{
users &&
users.map((user) => (
<UserCard
key={user.id}
userName={user.username}
imageUrl="https://source.unsplash.com/random"
userId={user.name}
/>
));
}
您有一个 loading
“状态”来防止在获取任何数据之前尝试呈现项目,但在 useAllUsers
中您实际上从未声明 [=11=] useState
,因此在 UserManagement
中它将始终为 false,导致它在准备就绪之前尝试渲染 users
。
要修复,你可以添加缺少的加载 useState,我也建议将一个空数组作为数组类型状态的初始值,如下所示:
const [users, setUsers] = useState<Array<User>>([])