Как в React вывести массив картинок?
В data приходит массив картинок, все ок, но не понимаю, как его отрендерить. Или это невозможно в функциональном компоненте? Я сильно новичок в этом. Используется стек Mern + multer.
function SubletCard(props) {
const [files, setFile] = useState([{data: [] }])
const tempArr = [];
const handleImageUpload = e => {
[...e.target.files].forEach(file => {
tempArr.push(
file
);
});
setFile(tempArr)
};
async function submitHandler(e) {
e.preventDefault()
setIsEditing(false)
props.setSublets(prev =>
prev.map(function (sublet) {
if (sublet._id == props.id) {
return { ...sublet, city: draftCity, rooms: draftRooms }
}
return sublet
})
)
const data = new FormData()
if (files) {
files.forEach(file => {
data.append("photos", file);
});
}
const newPhoto = await Axios.post("/update-sublet", data, { headers: { "Content-Type": "multipart/form-data" } })
if (newPhoto.data) {
props.setSublets(prev => {
return prev.map(function (sublet) {
if (sublet._id == props.id) {
return { ...sublet, photo: newPhoto.data }
}
return sublet
})
})
}
return (
<img src={props.photo ? `/uploaded-photos/${props.photo}` : "img/fallback.png"} className="card-img-top" alt={`${props.rooms} named ${props.city}`} />
)
}
Рендер app
function App() {
const [sublets, setSublets] = useState([])
useEffect(() => {
async function go() {
const response = await Axios.get('/api/Sublets');
setSublets(response.data);
}
go()
}, [])
return (
<div className='container'>
<p><a href='/'>« Back to the homepage</a></p>
<CreateNewForm setSublets={setSublets} />
<div className='sublet-grid'>
{sublets.map(function(sublet) {
return <SubletCard key={sublet._id} city={sublet.city} rooms={sublet.rooms}
photo={sublet.photo} id={sublet._id} setSublets={setSublets} />
})}
</div>
</div>
)
}
const root = createRoot(document.querySelector('#app'))
root.render(<App />)
Ответы (1 шт):
Автор решения: Vadim.Sharoikin
→ Ссылка
с вашими данными от бэка
[{"_id":"634001b50da78fb03f3ad311","city":"","rooms":"","photo":["1665139125149.jpg"]}, {"_id":"6340043266e84c3d836d72ba","city":"","rooms":"","photo":["1665139762346.jpg","1665139762356.jpg"]}, {"_id":"634021bcfff528fd485a707f","city":"Haifa","rooms":"1","photo":["1665147324549.jpg","1665147324563.jpg"]}]
первый рендер идет в компаненте app
{sublets.map(function(sublet) {
return <SubletCard key={sublet._id} city={sublet.city} rooms={sublet.rooms}
photo={sublet.photo} id={sublet._id} setSublets={setSublets} />
})}
Тут вы перебираете все значения пришедшиее от бэка. Для каждой позиции. Т.к. в каждой позиции у вас может быть массив с изображениями, вам надо перебрать их и в компоненте SubletCard.
{props.photo.map((photo,index) => (
<img key={index} src={photo ? /uploaded-photos/${props.photo}` : "img/fallback.png"} className="card-img-top" alt={${props.rooms} named ${props.city}} /> )
)}