【发布时间】:2020-04-15 18:11:41
【问题描述】:
我正在制作渲染来自 firebase 的所有产品的 React 应用程序。我正在获取对象数据并用具有正确 url 链接的新数组替换图像数组。之后,我用对象数组设置状态。一切都很顺利,直到我需要映射该对象数组并从对象的图像数组中获取第一张图像。我可以从对象访问所有数据,也可以获得 images 数组,但是当我指向确切值时 (images[0]) 我得到 undefined em>
我的代码
export default class List extends React.Component {
constructor(props) {
super(props);
this.state = {
loaded: false,
productsArr: []
}
}
componentDidMount() {
this.setState({
loaded: true
})
db.collection('products').get().then((list) => {
let productsArr = []
list.forEach((doc) => {
let obj = doc.data();
let imgArr =[];
obj.images.forEach((img) => {
storageRef.child(`images/${img}`)
.getDownloadURL()
.then(url =>{
imgArr.push(url)
})
.catch(err => {
console.log('Getting image url ERROR', err)
})
})
const newObj = Object.assign(obj, {images: imgArr})
productsArr.push(newObj)
})
this.setState({
productsArr,
})
})
}
render() {
return(
<div>
<Header />
{this.state.loaded ? <Loading /> : null}
<div>
{this.state.productsArr.map((product, i) => {
let arr = product.images
console.log(arr)
return (
<div key={i}>
<div>
<div>
<img src={product.images[0]}
alt={product.category}
/>
</div>
</div>
</div>
)
})}
</div>
<Footer />
</div>
)
}
}
对象的外观:
{
category: "wooden",
color: "black",
height: "13",
id: "103A220",
images: ["https://firebasestorage.googleapis.com/v0/b/remini…=media&token=8668-deeac8dd21e0"],
price: "4",
productName: "Wood",
warehouse: true,
width: "14"
}
【问题讨论】:
-
您能从那个console.log 中看到产品对象吗? console.log(arr)
-
该日志仅用于测试目的,但使用 arr 变量我可以看到带有值的图像数组。如果我记录 product 那么我可以看到产品对象
-
试试这个。
this.state && this.state.productsArr && this.state.productsArr.map(因为我尝试了与您实施的相同的事情。渲染部分完全没问题。唯一可能发生的问题是 productArr 没有完全加载到 reder 部分。 -
我试过了,结果一样undefined
-
检查 this.state.productsArr 后必须使用渲染。只需添加一个 if 语句
if(this.state.productsArr){render(){your mapping code}} else {render(){return(<div></div>)}}
标签: javascript arrays reactjs firebase object