You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webpack环境下如何在map遍历对象数组时正确引入图片?

解决React中遍历数组加载本地图片不显示的问题

问题描述

我有如下结构的对象数组:

export const NGOarray = [
  {
    name: "1% for the Planet ",
    description:
      "A leading global nonprofit, building a movement of businesses and individuals delivering philanthropic support to environmental organizations working on the front lines for our planet.",
    link: "https://onepercentfortheplanet.org/",
    category: ["water", "everything"],
    logo: "1fortheplanet.webp",
  },
  {
    name: "4ocean",
    description:
      "As both a public benefit corporation and Certified B Corp, we’re committed to ending the ocean plastic crisis.",
    link: "https://www.4ocean.com",
    category: ["water", "everything"],
    logo: "4 Ocean.svg",
  }
]

其中logo属性对应文件夹中的图片文件名。我尝试通过map遍历该数组并展示图片,代码如下:

{NGOarray.map((org) => {
        
                <div key={org.name}>
                  {org.logo && (
                    <img
                         src={
                    require(`../assets/organizations/${org.logo}`)
                      .default
                  }
                    />
                  )}
                  <h3 className="text-2xl font-sans mb-4">{org.name}</h3>
                  <p>{org.description}</p>
                </div>
              );
            }

但图片无法正常显示,请问该如何解决这个问题?

解决办法

1. 修复JSX返回问题

你的map回调函数使用了大括号{}但没有显式返回JSX元素,这是核心问题之一。有两种修复方式:

方式一:添加显式return

{NGOarray.map((org) => {
  return (
    <div key={org.name}>
      {org.logo && (
        <img
          src={require(`../assets/organizations/${org.logo}`).default}
          alt={org.name} // 建议添加alt属性,提升可访问性
        />
      )}
      <h3 className="text-2xl font-sans mb-4">{org.name}</h3>
      <p>{org.description}</p>
    </div>
  );
})}

方式二:使用箭头函数隐式返回

去掉大括号,直接用圆括号包裹JSX:

{NGOarray.map((org) => (
  <div key={org.name}>
    {org.logo && (
      <img
        src={require(`../assets/organizations/${org.logo}`).default}
        alt={org.name}
      />
    )}
    <h3 className="text-2xl font-sans mb-4">{org.name}</h3>
    <p>{org.description}</p>
  </div>
))}

2. 校验文件路径与文件名

  • 确认../assets/organizations/路径相对于当前组件文件的位置正确
  • 检查文件名的大小写和空格是否与实际文件完全一致(部分打包工具对大小写敏感)
  • 确保图片文件确实存在于指定文件夹中

3. 根据打包工具调整加载方式

如果是Vite项目,require语法不兼容,需要改用new URL方式加载:

<img
  src={new URL(`../assets/organizations/${org.logo}`, import.meta.url).href}
  alt={org.name}
/>

如果是Create React App项目,原有的require+.default写法是正确的,但要确保打包工具支持对应图片格式(CRA默认支持webp、svg)

4. 添加调试与兜底处理

可以给img标签添加onError事件,方便排查加载失败的原因,同时设置兜底图片:

<img
  src={require(`../assets/organizations/${org.logo}`).default}
  alt={org.name}
  onError={(e) => {
    console.error(`图片加载失败: ${org.logo}`, e);
    e.target.src = '../assets/default-logo.png'; // 替换为你的兜底图片路径
  }}
/>

内容的提问来源于stack exchange,提问作者Steph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:48:20