0

0

如何在 React 中正确从 JSON 数据中加载并显示图片

心靈之曲

心靈之曲

发布时间:2026-01-11 22:45:42

|

318人浏览过

|

来源于php中文网

原创

如何在 React 中正确从 JSON 数据中加载并显示图片

本文详解 react 应用中从 json 文件动态渲染图片的正确方式,重点解决因路径错误、`require()` 字符串化、公共目录配置不当等导致的图片不显示问题,并提供可直接运行的实践方案。

在 React 中直接将 "require('@img/person1.jpg')" 这类字符串写入 JSON 并期望自动执行模块引入,是根本不可行的——JSON 是纯数据格式,不支持函数调用或动态导入语法。Webpack/Vite 等构建工具在编译期解析 require() 或 import(),而 JSON 中的字符串仅被当作普通文本读取,不会触发模块解析,因此 <img src="require('@img/person1.jpg')"/> 实际会尝试加载一个名为 require('@img/person1.jpg') 的无效路径,必然 404。

✅ 正确做法是:将图片资源统一置于 public/ 目录下,使用绝对路径引用(如 /images/person1.jpg),或在 JavaScript 层预导入图片变量,再注入 JSON 数据结构。

✅ 推荐方案一:使用 public/ 目录(最简单可靠)

将所有头像图片放入 public/images/ 文件夹(例如 public/images/person1.jpg),然后在 JSON 中存储相对 public 根路径的 URL:

[
  {
    "id": 0,
    "comittee": false,
    "img": "/images/person1.jpg",
    "desc": "Here's a short description...",
    "position": "member"
  },
  {
    "id": 1,
    "comittee": false,
    "img": "/images/person2.jpg",
    "desc": "Here's a short description...",
    "position": "member"
  }
]

组件中直接使用该路径即可:

Bolt.new
Bolt.new

Bolt.new是一个免费的AI全栈开发工具

下载
function Person({ name, img, position, desc }) {
  return (
    <div className="person-card">
      <h3>{name}</h3>
      <img 
        src={img} 
        alt={`${name}'s profile`} 
        onError={(e) => {
          e.target.src = '/images/placeholder.png'; // 可选:兜底占位图
        }}
      />
      <p><strong>{position}</strong></p>
      <p>{desc}</p>
    </div>
  );
}
⚠️ 注意:public/ 下的文件通过 /xxx 访问,无需 import;但路径必须以 / 开头,确保为根绝对路径(避免路由嵌套时路径解析错误)。

✅ 推荐方案二:JS 预导入 + 数据组合(适合需 Webpack 处理的场景,如 SVG/优化压缩)

若需利用 require() 或 import 触发 Webpack 图片处理(如生成哈希名、内联 base64、SVG React 组件等),则不能将 require() 写入 JSON,而应在 JS 中完成导入与数据合并:

// data.js
import person1 from '@img/person1.jpg';
import person2 from '@img/person2.jpg';

export const profiles = [
  { id: 0, name: 'Alex Johnson', img: person1, position: 'member', desc: '...' },
  { id: 1, name: 'Sam Lee',     img: person2, position: 'member', desc: '...' },
];

然后在组件中直接导入使用:

import { profiles } from './data.js';

function App() {
  return (
    <section className="profiles">
      {profiles.map((data) => (
        <Person 
          key={data.id} 
          name={data.name} 
          img={data.img} 
          position={data.position} 
          desc={data.desc} 
        />
      ))}
    </section>
  );
}

❌ 常见错误总结

  • 将 require(...) 作为字符串存入 JSON → ❌ JSON 不执行代码
  • 使用相对路径如 img/person1.jpg 且未配 public/ → ❌ 资源 404(除非用 file-loader 等特殊配置)
  • 忘记为 <img> 添加 alt 属性 → ❌ 可访问性不合规
  • 未处理图片加载失败 → ❌ 用户看到空白或断裂图标(建议用 onError 回退)

✅ 最佳实践建议

  • 优先采用 public/ 方案,简洁、零配置、兼容 SSR;
  • 图片命名语义化(如 person-alex-johnson.jpg),便于维护;
  • 对关键头像添加 loading="lazy" 和 decoding="async" 提升性能;
  • 生产环境启用图片压缩(如 vite-plugin-imagemin 或 Webpack image-minimizer-webpack-plugin)。

只要避开“字符串化 require”这一核心陷阱,React 中 JSON 驱动的图片渲染便能稳定可靠地工作。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

456

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

510

2023.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号