【问题标题】:React Dynamically Import ImagesReact 动态导入图片
【发布时间】:2021-04-20 12:02:50
【问题描述】:

在我的 React 代码中,我想在我的文件夹中显示几张图片。我有大约 100 张图像,我不想在不同的导入语句中导入所有图像。我想用图像的索引导入它们。以下是我的意思:

import LoadImages from './images/${index}.jpeg';

有没有类似上面的导入语句?

这是一个包含两张图片的示例:

import React from 'react';
import './App.css';
import Image1 from './images/0.jpeg';
import Image2 from './images/1.jpeg';

const images = Array.from({ length: 2 }, (_, i) => {
  return (
    <img
      src={i === 0 ? Image1 : Image2}
      alt={i.toString()}
      key={i}
      style={{ marginBottom: '3%', marginTop: '3%' }}
    />
  );
});

export default function App() {
  return <div className='App'>{images}</div>;
}

上面的代码只包含 2 张图片。我应该如何处理近 100 张图像?另外,在图片组件的 src 部分,我不能用这个结构来处理 100 张图片。

你建议我怎么做?

【问题讨论】:

    标签: reactjs image dynamic-import conditional-rendering


    【解决方案1】:

    您可以将您的图片放在public 文件夹或s3 存储桶等中。

    在“何时使用公共文件夹”标题下的 CRA 文档中;如果“您有数千张图像并且需要动态引用它们的路径”,则建议使用它。

    然后你可以做这样的事情;

    new Array(15)
      .fill(1)
      .map((_, i) => ({
        <img
          src={"/public/images/" + i + ".jpeg" }
          key={i}
          className="img-fluid"
        />
      }))
    

    小注:Array(15).fill(1) 基本上是指创建 15 个元素的数组,然后将 1 放入其中。由于我们无法在 jsx 中执行 for 循环,因此我们创建一个包含 15 个(或您想要的数量)元素的数组并通过它们进行映射。

    【讨论】:

    • 您好 Emre,感谢您的评论。数字 15 是否指定了数组的长度?例如,如果我不知道图像的数量,(假设我通过我的代码将这些图像上传到存储,而不知道图像的数量。我想从云存储中检查这些图像)我该如何处理案例,你有什么想法吗?
    • 对不起,我应该更清楚。 Array(15).fill(1) 基本上意味着创建 15 个元素的数组并将 1 放入其中。由于我们无法在 jsx 中执行 for 循环,因此我们创建了一个包含 15 个(或您想要的数量)元素的数组并通过它们进行映射。关于您的其他问题;如果我们的 react 应用程序是客户端,而不是使用 nextjs 之类的框架,我们将无法访问我们计算机或服务器中的文件系统。我们必须知道数组的元素才能映射它们。您可以在后端检查它并从您的 api 返回一组带有 URL 的图像元素,然后像休闲 api 调用响应一样,映射它们。
    • 如果您使用的是 s3 之类的东西;我相信他们有 api 响应,可以告诉您存储桶文件夹中有多少图像及其 URL。如果您有自己的后端,也可以这样做,创建一个端点来返回您的文件及其 URL。
    【解决方案2】:

    如果加载图片等资产,您可以通过require 同步加载它们。假设您在 webpack 配置中使用 file-loader

    解决方案如下:

    const images = Array.from({ length: 2 }, (_, i) => {
      return (
        <img
          src={require(`./images/${i}`).default}
          alt={i.toString()}
          key={i}
          style={{ marginBottom: '3%', marginTop: '3%' }}
        />
      );
    });
    
    

    基于新请求而不知道名称的更新

    如果你不知道文件名,你可以去require.context加载你需要的文件如下:

    const templates = require.context('./images', true, /\.(jpg|jpeg)$/);
    
    const images = templates.keys().map((elem) => (
      <img key={elem} src={templates(elem).default} />
    ))
    

    【讨论】:

    • 如何将文件加载器添加到 webpack 配置中?我不为 webpack 使用 ant 附加配置。所有配置均来自 create-react-app。
    • 另外,我想问一个问题。如果我不知道图像的数量,我该如何编写这种情况的代码?
    • 如果您使用 CRA,它已经为您设置好了,所以您只需使用代码,无需配置任何东西。
    • 我给你提出了另一个建议,如何在不知道文件名的情况下在 webpack 中加载图像
    • 我对您的额外解释感到非常满意。可能,您的附加解释解决了我的图像数量不定的问题。我将在我的应用中尝试这些代码,并在此处添加我的评论。
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 2019-09-20
    • 2021-03-22
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多