如何在 React 中动态导入图像?

IT技术 javascript reactjs web webpack dynamic-import
2021-04-27 10:20:23

在网上看到了几个答案,但没有明确的解释,解决方案也不起作用。所以这就是我想要做的:

  • 我有一个包含许多图像(数千张)的文件夹- 目前它保存在src/assets/images文件夹下
  • 例如,给定一个图像列表作为输入,我想动态渲染这些图像并且不全部导入,因为考虑到疯狂的图像数量这是不可能的

这是我目前的实现方式(不起作用):

// for example
const imageList = ['img1', 'img2', 'img3' /*...so on */]

const getImagePath = (image) => {
  return `../assets/images/${image}.jpg`
}

function ImagesPage() {
  return (
    <>
      <p>Below should show a list of images</p>
      {imageList.map((img) => {
        return <img src={require(getImagePath(img))} />
      })}
    </>
  )
}

从我在线阅读的内容来看,这与webpack 的工作方式有关,并且只有在将确切的字符串路径输入到以下内容时才会起作用require

// This works:
<img src={require('../assets/images/img1.jpg')} />

// But all these will not work:
<img src={require(getImagePath(img))} />

const img = 'img1.jpg'
<img src={require(`../assets/images/${img}`)} />

知道如何让这种动态导入图像在我上面描述的场景中工作吗?我认为这篇文章对其他寻找答案的人也会很有帮助。

4个回答

添加 .default 即可解决问题

<img src={require(`../../folder-path/${dynamic-filename}.png`).default} />

TLDR;

// All of these works

const fileNameExt = 'foo.jpg'
<img src={require('../images/' + fileNameExt)} />
<img src={require(`../images/${fileNameExt}`)} />

const fileName = 'foo'
<img src={require('../images/' + fileName + '.jpg')} />
<img src={require(`../images/${fileName}.jpg`)} />

// These does not work:

const myPathVariable1 = '../images/' + 'foo' + '.jpg'
<img src={require(myPathVariable1)} />

const myPathVariable2 = '../images/' + 'foo.jpg'
<img src={require(myPathVariable2)} />

您可以使用表达式动态地要求

文件名:

const imageList = ["img1", "img2", "img3", ... ]

而呈现在UI(添加目录路径扩展里面require):

{
  imageList.map(img => {
    return <img src={require("../assets/images/" + img + ".jpg")} />
  })
}

为什么有效?:

Webpack 可以理解这个表达式,通过生成关于 directory 和 extension 的上下文,并且可以加载所有匹配的module。

更新您的getImagePath函数以返回一个img元素。

const getImage = (image) => {
   return <img src={require(`../assets/images/${image}.jpg`)} />
}

那么你的map函数看起来像这样:

imageList.map((img) => {
   return getImage(img);
});
  // for example
const imageList = ['img1', 'img2', 'img3' /*...so on */]

const getImagePath = (image) => {
  return `../assets/images/${image}.jpg`
}

function ImagesPage() {
  return (
    <>
      <p>Below should show a list of images</p>
      {imageList.map((img) => {
        return <img src={require(getImagePath(img)).default} />
      })}
    </>
  )
}

如果您使用“创建react应用程序”,添加.defaultrequire工作正常,它会从本地图像文件夹动态设置所有图像。