【问题标题】:render multiple images in React using map使用地图在 React 中渲染多个图像
【发布时间】:2021-09-12 23:23:13
【问题描述】:

我有带有键 img 的对象,值是放置在 src 文件夹“/images”中的图像文件夹的相对路径。我正在使用 map 循环解构数据,并使用这样的简单模板将其添加到 DOM:

<div key={id}>

<img src={img + '.jpg'} alt='{title}' />
</div>

我的数据对象如下所示:

const category = [
  {
    id: 1,
    title: 'cizme',
    img: './images/cizme',
    link: './cizme'},
...

数据(类别)在App组件中定义

import data from './data';
import Home from './Home';
import logo from './images/logo_fin-01.png';

import Navbar from './Navbar';

function App() {
  return (
    <div className='App'>
      <Navbar logo={logo} />
      <Home data={data} />
    </div>
  );
}

export default App;

而主场比赛是:

const Home = ({ data }) => {
  return (
    <div className='kat'>
      {data.map(({ id, title, img, link }) => (
        <li key={id}>
          <span>{title}</span>
          <div className='img-container'>
            <img src={img + '.jpg'} alt={title}></img>
          </div>
        </li>
      ))}
    </div>
  );
};

export default Home;

现在,在浏览器路径中显示正确,没有错误,但它说图像'无法加载图像'。我试图将图像文件夹复制到公共但然后我得到错误'它超出范围或类似这个(我忘了)'。那我该怎么办?

更新: require() 在沙盒中工作,localy 不行。

https://codesandbox.io/embed/zealous-christian-0j3v3?fontsize=14&hidenavigation=1&theme=dark

【问题讨论】:

  • 检查检查器中的网络选项卡。是否加载了正确的 URL?您如何提供图片?
  • status: 200 OK 对不起,你觉得“服务”怎么样?
  • 我在 App 组件中导入 data.js,然后我将 props 发送到我解构的其他组件并将 img 值添加到 DOM
  • 这能回答你的问题吗? Correct path for img on React.js
  • 没有。 :) 我确定缺少简单的东西......还有我正在导入的标志 img 就像从'./images/logo_fin-01.png'导入标志;它有效。但是,如果我在 devTools 中查看它的路径,它会说 /static/media/logo...

标签: reactjs


【解决方案1】:

您当前的方法不起作用(除非您必须通过循环导入图像),因为您已将这些图像保存在 src 文件夹中。通过将图像 url 保持为相对于当前文件夹将不起作用,因为当将 URL 传递给 src(而不是导入的图像)时,您的浏览器开始呈现,imgsrc 属性将看起来尊重到 URL,而不是加载和执行 javascript 文件的文件夹。

换句话说,如果我为这个映射的图像路由提供服务的组件位于 URL xyz.com/something/currentScreen,那么 './images/cizme' + '.jpg' 将转换为不存在的 xyz.com/something/images/cizme.jpg

由于您正在尝试动态呈现这些图像,一个好方法是将它们放在 public 文件夹中(然后放在“图像”文件夹中,因为您的 URL 是这样说的),然后有 '/images/cizme' + '.jpg' 哪个将导致xyz.com/images/cizme.jpg 正确加载,因为它们存在于public 文件夹中。

编辑:你能确认你的浏览器路径是正确的吗?尝试按照 cmets 中的说明打开网络选项卡。

【讨论】:

  • 这对我来说似乎没问题。 images 文件夹位于 src 文件夹内。 &lt;img src="./images/stitnici" alt="stitnici"&gt;&lt;/img&gt; 网络标签:这个..我不知道它是否可以...? GET http://localhost:3000/images/ostalo
  • 请再次阅读我的回答。我建议将图像放在public 文件夹中,因为您不必以这种方式一张一张地导入图像。我为您的用例制作的Here's a working CodeSandBox。请注意,您还必须附加图像的扩展名,我在您的评论中没有看到。查看data.js 文件,了解我的意思。
  • P.S: 请注意,public 文件夹中保存的任何内容都不受 webpack 影响,并且有一些缺点。 Read more here
【解决方案2】:

我假设由于您的 category 数组指定了它在编译时生成的本地/相对路径(而不是在运行时生成的一些动态值),因此,将可以访问位于src源目录。

您可以导入所有图像并在category 数组中指定它们。

import img1 from './images/cizme.jpg';
...

const category = [
  {
    id: 1,
    title: 'cizme',
    img: img1,
    link: './cizme'
  },
...

或者由于明确列出所有导入是不切实际的,您可以只在数据中要求它们。

const category = [
  {
    id: 1,
    title: 'cizme',
    img: require('./images/cizme.jpg'),
    link: './cizme'
  },
...

然后你就可以正常渲染图像了。

{category.map(({ id, img, title}) => (
  <div key={id}>
    <img src={img} alt='{title}' />
  </div>
))}

更新

我更新了我的链接代码框以反映您的代码。如果导出的data 使用require 拉入图像,那么Home 可以简单地将img 值附加到src 属性。

const Home = ({ data }) => {
  return (
    <div className="kat">
      {data.map(({ id, title, img, link }) => (
        <li key={id}>
          <span>{title}</span>
          <div className="img-container">
            <img src={img} alt={title}></img>
          </div>
        </li>
      ))}
    </div>
  );
};

src 的“./images”目录中的 cat1.jpg、cat2.jpg 和 cat3.jpg 图像为例。

代码:

数据.js

const data = [
  {
    id: 1,
    title: "cizme",
    img: require("./images/cat1.jpg"),
    link: "./cizme"
  },
  {
    id: 2,
    title: "cizme",
    img: require("./images/cat2.jpg"),
    link: "./cizme"
  },
  {
    id: 3,
    title: "cizme",
    img: require("./images/cat3.jpg"),
    link: "./cizme"
  }
];

export default data;

App.js

import data from "./data";

const Home = ({ data }) => {
  return (
    <div className="kat">
      {data.map(({ id, title, img, link }) => (
        <li key={id}>
          <span>{title}</span>
          <div className="img-container">
            <img src={img} alt={title}></img>
          </div>
        </li>
      ))}
    </div>
  );
};

export default function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Edit to see some magic happen!</h2>

      <Home data={data} />
    </div>
  );
}

【讨论】:

  • 一切看起来都一样,除了 require....有什么具体的进口吗? ./src/data.js Module not found: Can't resolve './images/cizme' in '/home/zoran/Documents/web tests/sikimoto/sikimoto-app/src'
  • @zoranlazarevic 哦,对不起,我想我忘了提到在需要这样的文件时需要包含文件扩展名。在我的示例中,但我没有明确指出。
  • 所以...我包括了要求和扩展,一切看起来都一样..但我仍然无法让它们出现! DevTools 现在显示 &lt;img src=[object modules] &gt;
  • @zoranlazarevic 认为您可以尝试创建自己的 running 代码框来重现图像上的[object modules] 问题并分享?
  • 最简单的解决方案是使用 gphotos!感谢您的努力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2019-11-21
  • 2018-01-14
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多