数组最初显示为空,我相信这是导致“.map 不是函数”错误的原因
Array is showing empty initially, and I believe it's causing ".map is not a function" error
我正在尝试从 strapi api 获取一些数据,但我 运行 遇到了一个问题,它指出 .map 不是 badgeCategories 的函数.
这是获取 API 和更新 badgeCategories 的代码示例。
export default function Home({ posts }) {
const [badgeCategories, setbadgeCategories] = useState([]);
useEffect(() => {
const fetchBadgeCatData = async () => {
const badgeCatResult = await api.getBadgeCategories();
setbadgeCategories(badgeCatResult.data);
};
fetchBadgeCatData();
}, [])
我试图控制日志 badgeCategories 并注意到数组最初是空的运行。
{console.log(badgeCategories)}
当代码到达
{badgeCategories.map((g) => (
<div>
我收到一个错误提示
TypeError: badgeCategories.map is not a function
我的假设是抛出错误是因为数组最初显示为空,因此无法处理 .map 函数;但是我有点卡住了,还没能解决这个问题。任何帮助将不胜感激,我确信我缺少的是简单的东西。
完整地图主体:
{badgeCategories.map((g) => (
<div>
<div className="pt-6 pb-4">
<h1 className="text-2xl font-extrabold leading-4 tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl sm:leading-10 md:text-2xl md:leading-9">
{g.attributes}
</h1>
<p className="text-md text-gray-500 dark:text-gray-400">
{g.description}
</p>
</div>
<div className="container">
<div className="flex flex-wrap">
<ul className="w-full space-y-2">
{itemData.filter(item => item.group == g.id).map(filteredItem => (
<li key={filteredItem.order}>
<Item
type={filteredItem.type}
text={filteredItem.text}
color={filteredItem.color}
href={filteredItem.href}
hrefActive={filteredItem.hrefActive}
/>
</li>
))}
</ul>
</div>
</div>
</div>
))}
你说得对,数组最初是空的。但是,当您在 useState
调用中为数组设置初始值时,这不应引发错误:
const [badgeCategories, setbadgeCategories] = useState([]);
// here ^^
可能导致问题的原因实际上不是数据尚未加载,而是数据已经加载。从你控制台的截图看,新数据好像不是数组。
[] // before the data loads, `badgeCategories` is an empty array.
{ data: Array(2), meta: {...} } // after it loads, `badgeCategories` is an object
// containing a `data` property of an array.
这似乎来自这行代码:
const badgeCatResult = await api.getBadgeCategories();
setbadgeCategories(badgeCatResult.data); // NOT an array!
好像badgeCatResult.data
不是一个数组,而是一个包含一个data
属性的对象,那是一个数组。试试改用这个:
const badgeCatResult = await api.getBadgeCategories();
setbadgeCategories(badgeCatResult.data.data); // This should work!
您可以通过在调用 map
之前检查 badgeCategories 是否为有效数组来简单地避免错误
{Array.isArray(badgeCategories) && badgeCategories.map((g) => (
<div>
.....
)
}
我正在尝试从 strapi api 获取一些数据,但我 运行 遇到了一个问题,它指出 .map 不是 badgeCategories 的函数.
这是获取 API 和更新 badgeCategories 的代码示例。
export default function Home({ posts }) {
const [badgeCategories, setbadgeCategories] = useState([]);
useEffect(() => {
const fetchBadgeCatData = async () => {
const badgeCatResult = await api.getBadgeCategories();
setbadgeCategories(badgeCatResult.data);
};
fetchBadgeCatData();
}, [])
我试图控制日志 badgeCategories 并注意到数组最初是空的运行。
{console.log(badgeCategories)}
当代码到达
{badgeCategories.map((g) => (
<div>
我收到一个错误提示
TypeError: badgeCategories.map is not a function
我的假设是抛出错误是因为数组最初显示为空,因此无法处理 .map 函数;但是我有点卡住了,还没能解决这个问题。任何帮助将不胜感激,我确信我缺少的是简单的东西。
完整地图主体:
{badgeCategories.map((g) => (
<div>
<div className="pt-6 pb-4">
<h1 className="text-2xl font-extrabold leading-4 tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl sm:leading-10 md:text-2xl md:leading-9">
{g.attributes}
</h1>
<p className="text-md text-gray-500 dark:text-gray-400">
{g.description}
</p>
</div>
<div className="container">
<div className="flex flex-wrap">
<ul className="w-full space-y-2">
{itemData.filter(item => item.group == g.id).map(filteredItem => (
<li key={filteredItem.order}>
<Item
type={filteredItem.type}
text={filteredItem.text}
color={filteredItem.color}
href={filteredItem.href}
hrefActive={filteredItem.hrefActive}
/>
</li>
))}
</ul>
</div>
</div>
</div>
))}
你说得对,数组最初是空的。但是,当您在 useState
调用中为数组设置初始值时,这不应引发错误:
const [badgeCategories, setbadgeCategories] = useState([]);
// here ^^
可能导致问题的原因实际上不是数据尚未加载,而是数据已经加载。从你控制台的截图看,新数据好像不是数组。
[] // before the data loads, `badgeCategories` is an empty array.
{ data: Array(2), meta: {...} } // after it loads, `badgeCategories` is an object
// containing a `data` property of an array.
这似乎来自这行代码:
const badgeCatResult = await api.getBadgeCategories();
setbadgeCategories(badgeCatResult.data); // NOT an array!
好像badgeCatResult.data
不是一个数组,而是一个包含一个data
属性的对象,那是一个数组。试试改用这个:
const badgeCatResult = await api.getBadgeCategories();
setbadgeCategories(badgeCatResult.data.data); // This should work!
您可以通过在调用 map
之前检查 badgeCategories 是否为有效数组来简单地避免错误{Array.isArray(badgeCategories) && badgeCategories.map((g) => (
<div>
.....
)
}