useQuery() 挂钩中的数据 属性 returns 无法读取未定义的属性
data property in useQuery() hook returns Cannot read properties of undefined
这是一个非常令人费解的问题。下面的代码给出了这个错误:
TypeError: Cannot read properties of undefined (reading 'map')
用console.log()看res.data的时候还好,有数据。 res.data.products 未定义,因此炸毁了 .map()。为什么这不起作用只是没有意义。开始觉得react-query库有bug
export default function ProductList() {
const { data: products, isLoading } = useQuery('Products', () =>
axios('/api/products').then((res) => res.data.products)
);
if (isLoading) return <LoadingSpinner />
return products.map((product) => (
<ProductItem key={product.id} product={product} />
));
}
从 useQuery
编辑的数据 return 的类型为 undefined | T
。这意味着它可以是未定义的,也可以是您期望的形状。这是因为,当您第一次获取数据时,您的缓存中没有它,所以您必须获取它,通常是通过 HTTP 请求。因为此数据有可能 undefined
,所以您必须防止未定义的情况。
return (products?.map(..
如果您将代码更新为上述代码,它首先会检查产品是否已定义。如果尚未定义,它将向地图函数提供一个空数组。因为没有什么可以映射 return 语句是一个空数组。
此外,如果您在 useQuery
调用之后立即放置控制台日志语句,您应该注意到它首先使用 undefined,只有在请求被解析后数据才会开始流动。
就是说,有一种情况 isLoading
是错误的,但数据是“未定义的”,因为它永远无法自行解析。
这样想:
- 加载时我们应该显示什么
- 数据准备好后我们应该显示什么
- 当我们不再加载并且数据失败时,我们应该显示什么returned
这是一个非常令人费解的问题。下面的代码给出了这个错误:
TypeError: Cannot read properties of undefined (reading 'map')
用console.log()看res.data的时候还好,有数据。 res.data.products 未定义,因此炸毁了 .map()。为什么这不起作用只是没有意义。开始觉得react-query库有bug
export default function ProductList() {
const { data: products, isLoading } = useQuery('Products', () =>
axios('/api/products').then((res) => res.data.products)
);
if (isLoading) return <LoadingSpinner />
return products.map((product) => (
<ProductItem key={product.id} product={product} />
));
}
从 useQuery
编辑的数据 return 的类型为 undefined | T
。这意味着它可以是未定义的,也可以是您期望的形状。这是因为,当您第一次获取数据时,您的缓存中没有它,所以您必须获取它,通常是通过 HTTP 请求。因为此数据有可能 undefined
,所以您必须防止未定义的情况。
return (products?.map(..
如果您将代码更新为上述代码,它首先会检查产品是否已定义。如果尚未定义,它将向地图函数提供一个空数组。因为没有什么可以映射 return 语句是一个空数组。
此外,如果您在 useQuery
调用之后立即放置控制台日志语句,您应该注意到它首先使用 undefined,只有在请求被解析后数据才会开始流动。
就是说,有一种情况 isLoading
是错误的,但数据是“未定义的”,因为它永远无法自行解析。
这样想:
- 加载时我们应该显示什么
- 数据准备好后我们应该显示什么
- 当我们不再加载并且数据失败时,我们应该显示什么returned