React Full Stack:无法读取未定义的属性(读取‘map’)
2021-11-25
62
我想弄清楚我在这里做错了什么,但我并不完全确定。我想从网站传递一个对象,根据数据库(澳大利亚)它是“颜色”。
然后我想将此数组映射到前端以仅显示这些颜色。例如,此数组具有 [“白色”,“黑色”,“红色”] 等。
最初我有一个
useEffect
函数,如下所示:
useEffect(() => {
const getProduct = async () => {
try {
const res = await publicRequest.get("/products/find/" + id);
setProduct(res.data);
} catch {}
};
getProduct();
}, [id]);
从这里,我试图映射:
<Filter>
<FilterTitle>Colour</FilterTitle>
{product.color.map((c)=> (
<FilterColour color={c} key={c}/>
))}
</Filter>
但我收到了经典的:
TypeError: Cannot read properties of undefined (reading 'map')
我尝试了 colour、color 等,但无法解决?有什么想法吗?Stack!
3个回答
在调用 setProduct 之前,您的默认值应具有 color 作为其属性,并且需要是一个数组。如果您在调用 setProduct 之后遇到此问题,只需检查 res.data 以查看您是否以预期的格式获取数据。
user3656091
2021-11-25
由于您尝试呈现的数据是异步函数的结果,
product
在初始渲染期间仍未填充,仅在之后填充。
我们通常在 React 中为规避这种情况所做的是添加条件语句。
这应该可以解决问题 -
<Filter>
<FilterTitle>Colour</FilterTitle>
{product.color && product.color.map((c)=> (
<FilterColour color={c} key={c}/>
))}
</Filter>
tomleb
2021-11-25
您需要确保要访问的属性保持相同的数据结构。如果不是,您需要检查它是否未定义。
解决方案 1:
保持相同的数据结构。 useState 钩子应初始化为:
const [product, setProduct] = useState({color: []})
// or populate other attributes in the initial state.
解决方案 2:
检查数据是否存在:
{product.color && product.color.map((c)=> (
<FilterColour color={c} key={c}/>
))}
Kaiwen Luo
2021-11-25