arrays - 如何将图像数组映射为每个列表项React JS的两个图像

标签 arrays reactjs mapping

我想为每个列表项映射两个图像。

我有一个 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/

相关文章:

java - hibernate “列---不能为空

javascript - 将对象数组减少为键值对映射,保留值数组中的重复条目

arrays - 在排序数组中查找索引

javascript - javascript 中参数的范围和对象可变性

java - 转换 map 中的两个原始数组。并将结果映射转换为该数组

javascript - React 中合成事件的使用困惑

Javascript 操作/转换 JSON

arrays - 向后循环数组(从下到上)VBA

reactjs - 如果文本超过一定数量的行,如何在 React 中截断文本并显示“阅读更多”按钮?

java - @EnableWebMvc 注解正在影响 Spring Boot 中的某些映射