我想为每个列表项映射两个图像。
我有一个 slider ,每个 View 将显示两张幻灯片,所以我希望它每个 View 显示 4 张图像。
目前,它只显示相同的图像,这正是我所期望的,我只是不知道如何为每个列表项映射两个不同的图像。
我该如何映射这个数组,以便每个列表项都有两个不同的图像?
SliderComponent.js
import React, { useState, useEffect, useRef } from "react";
import { IonGrid, IonRow, IonCol } from '@ionic/react';
import { Storage } from "aws-amplify";
import Slider from "react-slick";
import "slick-carousel/slick/slick.css";
const SliderComponent = (props) => {
const { job } = props;
const [images, setImages] = useState([]);
const settings = {
infinite: false,
slidesToShow: 2,
slidesToScroll: 2,
speed: 500,
rows: 1,
initialSlide: 0,
autoHeight: false,
focusOnSelect: true,
arrows: false,
};
useEffect(() => {
async function onLoad() {
try {
const downloadedImage = await getImage(job);
setImages(downloadedImage);
} catch (e) {
alert(e);
}
}
onLoad();
}, []);
async function getImage(jobID) {
const imageURL = await Storage.list(`${jobID}/completed/`);
let imagesToDownload = imageURL
let imagesAsArray = [];
for (let i = 0; i < imagesToDownload.length; i++) {
const imagesDownloaded = await getURLFromS3(imagesToDownload[i]);
imagesAsArray.push(imagesDownloaded)
}
return imagesAsArray
}
async function getURLFromS3(fileToDownload) {
const result = await Storage.get(fileToDownload.key)
return result;
}
return (
<div>
<IonGrid>
<IonRow style={{ justifyContent: 'center' }}>
<IonCol sizeXs="12" sizeSm="12" sizeMd="10" sizeLg="6" sizeXl="4" >
<Slider asNavFor={nav1} ref={slider => (slider2.current = slider)} {...viewSettings}>
{images.map((image, i) =>
<ul>
<li><img key={i} src={image} /></li> /// First image
<li><img key={i} src={image} /></li> /// Second image
</ul>
)}
</Slider>
</IonCol>
</IonRow>
</IonGrid>
</div>
)
}
export default SliderComponent;
props.job页面
import React, { useState, useEffect } from "react";
import { withRouter } from 'react-router-dom';
import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonGrid, IonCol, IonRow, } from '@ionic/react';
import { API, Auth } from "aws-amplify";
import SliderComponent from '../components/sliderComponent.js'
function propertyInfo(props) {
return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>prop address</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent>
<SliderComponent job={props.match.params.id} />
</IonContent>
</IonPage>
);
}
export default withRouter(propertyInfo);
最佳答案
您可以在映射之前对图像数组进行分块。如果您的应用程序有 lodash ,您可以使用_.chunk
函数:
lodash _.chunk(array, [size=1])
Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.
您还可以用几行代码编写自己的 block 函数:
function chunk(array, size) {
const chunked_arr = [];
let index = 0;
while (index < array.length) {
chunked_arr.push(array.slice(index, size + index));
index += size;
}
return chunked_arr;
}
结果(注意:正如 @HMR 指出的,image2
是有条件渲染的,因为如果你的图像数组是奇数,你的最后一个 block 将只有一个元素,并且会渲染一个损坏的图像标签) :
{chunk(images, 2).map(([image1, image2], i) =>
<ul key={i}>
<li><img src={image1} /></li>
{image2 && <li><img src={image2} /></li>}
</ul>
)}
关于arrays - 如何将图像数组映射为每个列表项React JS的两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61918415/