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

React中JSON配合img src={require()}失效问题求助

React动态导入本地图片失败的解决方案

你遇到的问题本质是打包工具(比如Webpack)的静态资源解析机制导致的:

  • 当你写require('./images/photosnap.svg')时,这是一个静态字符串路径,Webpack在编译阶段就能定位到文件,把它打包并生成正确的资源URL。
  • 但require(data.logo)里的data.logo是运行时才确定的变量,Webpack编译时没法提前知道它的具体值,也就没法提前处理对应的图片资源,所以会加载失败。

下面给你几种可行的解决办法:

方法1:手动导入+映射表

先把所有需要的图片手动导入,再创建一个路径到图片的映射,最后通过映射表获取图片:

import jobData from './data.json';
// 导入所有用到的图片
import photosnapLogo from './images/photosnap.svg';
import manageLogo from './images/manage.svg';
// 其他图片依次导入...

// 创建路径映射
const logoMap = {
  './images/photosnap.svg': photosnapLogo,
  './images/manage.svg': manageLogo,
  // 对应json里的每个logo路径
};

function Job(){
  return (
    <div className="jobList">
      {jobData.map((data)=>(
        <div className="job" key={data.id}>
          <div className="logo"> 
            <img src={logoMap[data.logo]} alt={data.company + " logo"}/>
          </div>
        </div>
      ))}
    </div>
  )
}

export default Job; 

方法2:用require.context批量导入

如果图片很多,手动导入太麻烦,可以用require.context批量读取文件夹里的图片,自动生成映射表:

import jobData from './data.json';

// 创建上下文,读取images文件夹下的所有svg文件
const logoContext = require.context('./images', false, /\.svg$/);
// 生成路径映射:键是json里的路径,值是图片资源
const logoMap = logoContext.keys().reduce((map, relativePath) => {
  // 把require.context返回的相对路径(比如./photosnap.svg)转换成json里的路径格式
  const fullPath = `./images/${relativePath.slice(2)}`;
  map[fullPath] = logoContext(relativePath).default;
  return map;
}, {});

function Job(){
  return (
    <div className="jobList">
      {jobData.map((data)=>(
        <div className="job" key={data.id}>
          <div className="logo"> 
            <img src={logoMap[data.logo]} alt={data.company + " logo"}/>
          </div>
        </div>
      ))}
    </div>
  )
}

export default Job; 

方法3:把图片放到public文件夹(Create React App适用)

如果你用的是Create React App,可以把图片放到项目根目录的public/images文件夹下,然后修改json里的logo路径为绝对路径:

{
  "logo": "/images/photosnap.svg",
  // 其他字段...
}

然后组件里直接用data.logo作为src:

<img src={data.logo} alt={data.company + " logo"}/>

这种方式下,图片不会被Webpack处理,而是作为静态资源直接访问,所以动态路径也能生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:57:13