在React.js上更正img的路径

one*_*dkr 108 javascript reactjs webpack

我的反应项目中的图像存在问题.事实上,我一直认为src属性的相对路径是建立在文件架构上的

这是我的文件架构:

components
    file1.jsx
    file2.jsx
    file3.jsx
container
img
js 
... 
Run Code Online (Sandbox Code Playgroud)

但是我意识到路径是建立在URL上的.在我的一个组件中(例如到file1.jsx)我有这个:

localhost/details/2
<img src="../img/myImage.png" /> -> works

localhost/details/2/id
<img src="../img/myImage.png" /> -> doesn't work, images are not displayed
Run Code Online (Sandbox Code Playgroud)

怎么可能解决这个问题?我希望在react-router处理的任何形式的路由中,所有图像都可以用相同的路径显示.

cla*_*ani 281

不试图回答这个问题 - 只是注意到在create-react-app中,图像的相对路径似乎不起作用.相反,您可以导入图像.

import logo from './logo.png' // relative path to image 

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为正确的答案 (22认同)
  • 那些动态图像,例如,在json文件中引用,在create-react-app中? (10认同)
  • @zok我想你会从JSON文件中导出变量,将变量导入到你的组件中.然后你可以照常引用它.例如,导出const my_src = variable_here,从my_file导入{my_src},以及src = {my_src}. (2认同)
  • `导入'./styles/style.less'; **从 './styles/images/deadline.png' 导入徽标;**` 当图像存在且路径正确时,我在找不到第二行模块时出现错误。 (2认同)
  • 不是这个,它只解决图像问题,但不解决路径问题.. Dima Gershman 的回答是任何文件 img 或其他路径的实际反应解决方案 (2认同)

Rub*_*san 89

如果您使用create-react-app创建项目,则可以访问您的公用文件夹.因此,您需要在image公用文件夹中添加文件夹.

公共/图片/

<img src="/images/logo.png" />

  • 这应该被标记为更受欢迎的答案.花了我不到60秒的时间来实现并立即解决了我的问题.谢谢鲁贝尔! (13认同)
  • 这对我有用。请记住,如果您将新图像添加到公共目录,则需要重新启动应用程序。 (4认同)

pre*_*lna 65

您正在使用相对网址,该网址相对于当前网址,而不是文件系统.您可以使用绝对网址解决此问题

<img src ="http://localhost:3000/details/img/myImage.png" />

但是,当您部署到www.my-domain.bike或任何其他网站时,这并不是很好.更好的方法是使用相对于站点根目录的URL

<img src="/details/img/myImage.png" />

  • 我不明白为什么在reactjs应用程序中显示图像非常困难.无论如何,这个解决方案对我不起作用. (66认同)
  • 谢谢,我会强调在 `details` 之前的 `/`(与 `./details` 等相比,对于可能将两者混为一谈的其他人)。 (3认同)
  • 即使对我来说它也不起作用。我正在使用带有 `cordova` 的 `reactjs` 并使用 `ES5` 作为 eslint (2认同)
  • 虽然这个和 claireablani 的解决方案都有效,但 claireablani 的解决方案是 create-react-app 文档推荐的。他们列出了将资源公开的许多好处 https://facebook.github.io/create-react-app/docs/using-the-public-folder#adding-assets-outside-of-the-module-系统 (2认同)

Dim*_*a G 39

随着create-react-app公共文件夹(与index.html的 ...).如果你把"myImage.png"放在那里,比如在img子文件夹下,那么你可以通过以下方式访问它们:

<img src={window.location.origin + '/img/myImage.png'} />
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为正确答案,因为它实际上是任何文件的所有类型路径的反应解决方案 (4认同)

Amj*_*d K 23

我建议使用传统的相对路径.您可以在图像中使用如下所示.我们可以在此public文件夹中放置任何内容,并可以将此文件夹作为目标文件进行访问images,videos依此类推......此设置是通过自身反应来完成 为此,请将图像保存在公共文件夹中.像这样......

在此输入图像描述

而且比你的jsx.

<img src="images/pitbull-mark.png" />
Run Code Online (Sandbox Code Playgroud)

  • 这帮助了我:) (2认同)

Sod*_*aab 20

在我的情况下,以下代码也适用.

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。这适用于您不想将图像存储在公共文件夹中的情况 (2认同)
  • 对于任何在 img 的 src 中遇到 [object Module] 错误的人,请执行以下操作 ```src={require('../logo.png').default}``` (2认同)

Hri*_*dya 10

我已经用过这种方式并且效果很好

import Product from "../../images/product-icon.png";
import { Icon } from "@material-ui/core";

<Icon>
    <img src={Product} style={{ width: "21px", height: "24px" }} />
</Icon>
Run Code Online (Sandbox Code Playgroud)


Man*_*ddy 7

总结一下,一些较旧的答案行不通,另一些则不错,但不会解释主题。

如果图片在“公共”目录中

例: \public\charts\a.png

在html中:

<img id="imglogo" src="/charts/logo.svg" />
Run Code Online (Sandbox Code Playgroud)

在JavaScript中:

动态创建图像到新的img:

var img1 = document.createElement("img");  
img1.src = 'charts/a.png';  
Run Code Online (Sandbox Code Playgroud)

将图片动态设置为ID为'img1'的现有img:

document.getElementById('img1').src = 'charts/a.png';
Run Code Online (Sandbox Code Playgroud)

如果图像在“ src”目录中:

例: \src\logo.svg

在JavaScript中:

import logo from './logo.svg';  
img1.src = logo;  
Run Code Online (Sandbox Code Playgroud)

在jsx中:

<img src={logo} /> 
Run Code Online (Sandbox Code Playgroud)


Tre*_*ang 5

根据官方使用说明将文件加载器 npm添加到 webpack.config.js,如下所示:

config.module.rules.push(
    {
        test: /\.(png|jpg|gif)$/,
        use: [
            {
                loader: 'file-loader',
                options: {}
            }
        ]
    }
);
Run Code Online (Sandbox Code Playgroud)

为我工作。