I have a product object and inside that object has an answer object and inside that has a photo property where some answers have photos. I tried creating a method that loops through every images array and creates and img tag and includes that src link but for some reason its not showing any image. I even console logged it and the links were appearing. Is there some simple way to do this that I’m missing?
import React, { useState } from 'react';
const Answer = ({answerObj}) => {
const handleImages = () => {
answerObj.photo.images.forEach(pic => {
console.log(pic);
return (
<img src={pic}
alt="some photo"
width="200px"
height="200px"
/>
);
})
};
return (
<div>
<div className="photoInfo">
<br />
<p>{answerObj.photo.photoBody}</p>
<br />
{answerObj.photo.images.length > 0 ? (
<div>
{handleImages()}
// commented out <img src={answerObj.photo.images[0]}
// commented out alt="some photo"
// commented out width="200px"
// commented out height="200px" />
</div>): null}
</div>
</div>
);
};
export default Answer;
DummyData:
const dummyData = [
{
productId: 100,
questions: [{
questionId: 10,
helpfulCount: 67,
body: 'Is this watch waterproof?',
answers: [{
answerId: 500,
body: 'This works up to 5 meters underwater.',
user: 'User231',
photo: {
photoBody:'Here are some photos of the waterproof watches:',
images: ['some link', 'some link', 'some link'],
photoHelpfulCount: 33
},
helpfulCount: 43,
date: 'May 1, 2019',
isSeller: true,
isReported: false
},
{
answerId: 501,
body: `To a degree, I wouldn't test it out.`,
user: 'User420',
photo: {
photoBody:'',
images: [],
photoHelpfulCount: -1
},
helpfulCount: 0,
date: 'May 3, 2019',
isSeller: false,
isReported: false
},
{
answerId: 502,
body: 'I tested it out 7ft underwater and so far so good.',
user: 'User367',
photo: {
photoBody:'Here is a photo of my watch underwater:',
images: ['some link'],
photoHelpfulCount: 5
},
helpfulCount: 8,
date: 'May 6, 2019',
isSeller: false,
isReported: false
},
{
answerId: 503,
body: 'Tried it out at a water park and it stopped working.',
user: 'User514',
photo: {
photoBody:'Here are some photos of the aftermath:',
images: ['some link', 'some link'],
photoHelpfulCount: 2
},
helpfulCount: 4,
date: 'May 1, 2019',
isSeller: false,
isReported: false
}],
}],
}
Advertisement
Answer
Map and return the mapped array instead of using forEach.
Also, it would be preferable to use JSX syntax (equivalent to React.createElement) instead of invoking a function that returns a component. (Invoking a standard function that returns JSX can cause problems with hooks, among other things)
const Answer = ({ answerObj }) => {
return (
<div>
<div className="photoInfo">
<br />
<p>{answerObj.photo.photoBody}</p>
<br />
{answerObj.photo.images.length > 0 ? (
<div>
{answerObj.photo.images.map(pic => (
<img src={pic}
alt="some photo"
width="200px"
height="200px"
/>
)
)}
</div>)
: null}
</div>
</div>
);
};
or
const AnswerPhoto = ({ pic }) => (
<img src={pic}
alt="some photo"
width="200px"
height="200px"
/>
);
const Answer = ({ answerObj }) => {
return (
<div>
<div className="photoInfo">
<br />
<p>{answerObj.photo.photoBody}</p>
<br />
{answerObj.photo.images.length > 0 ? (
<div>
{answerObj.photo.images.map(pic => <AnswerPhoto pic={pic} />)}
</div>)
: null}
</div>
</div>
);
};