我正在try 使用require()方法将路径粘贴到img标记内的图片.

这就是组件.props 正确地从父级传递,因为console.log(img)返回正确的路径.

import data from '../asset/data/blog-post.json'

function BlogPostFeed() {
    const post = data.map(item => {
        return <BlogPost
            key={item.id}
            img={item.img}
        />
    })
    return (
        <>
            {post}
        </>
    )
}

function BlogPost(props) {
    const { img } = props;
    return (
        <>
            <img src={require(img)} alt="photo" />
        </>
    )
}

这就是json文件的样子.

[ 
 {
        "id": 1,
        "img": "../photo/photo.jpeg"  
 }
]

我确信所有的文件夹路径都是正确的.

我try 粘贴路径<img src={require"../photo/photo.jpeg"} alt="sth"/>,并且正在工作.但是,<img src={require(img)}<img src={require(${img})} alt="sth"/>都不起作用.

我还try 将json文件更改为"img": require("../photo/photo.jpeg"),但随后出现了json文件的错误.

弹出错误Cannot find module '../photo/photo.jpeg'.

推荐答案

这个错误与webpack如何使用require()函数有关,这是react 的基础.require()不是标准的JAVASCRIPT函数,而是Node.js和webpack提供的功能.require()在构建过程中执行模块的同步读取,这意味着webpack需要在构建时(应用程序运行之前)了解模块之间的依赖关系,而不是在运行时.

因此,当您直接使用require("../photo/photo.jpeg")时,webpack知道要将该文件包括在构建包中,因为路径是静态的,而不是动态的.然而,当你try 使用require(img)时,webpack直到代码运行时才知道你指的是什么文件,这已经太晚了.

在这种情况下,我会提出两种可能的解决方案:

  1. Using dynamic imports:

这是现代JAVASCRIPT提供的功能,webpack也支持.下面是如何在您的组件中使用它:

import React, { useState, useEffect } from 'react';

function BlogPost(props) {
    const { img } = props;
    const [imgSrc, setImgSrc] = useState();

    useEffect(() => {
        import(`../${img}`)
        .then((image) => setImgSrc(image.default))
        .catch((err) => console.error(err));
    }, [img]);

    return (
        <>
            {imgSrc && <img src={imgSrc} alt="photo" />}
        </>
    );
}

请注意,您需要在JSON文件中提供项目根目录的相对路径,这样才能正常工作.

  1. Using public folder to serve the images: 如果你用的是create-react-app,你可以把你的图片放在公共文件夹里.然后,您可以通过它们相对于公用文件夹的路径来引用这些图像:
function BlogPost(props) {
    const { img } = props;
    return (
        <>
            <img src={process.env.PUBLIC_URL + '/photo/photo.jpeg'} alt="photo" />
        </>
    );
}

请注意,在您的JSON文件中,您只需要提供公共目录的路径.

Node.js相关问答推荐

node 无法验证第一个证书

node 上的磁盘压力

Mongoose查询-如何根据当前查找ID获取其他集合并将其插入到当前查找中?

在内存中加载安全密钥安全吗?还是每次都从文件中读取?

为什么我的过滤器无法在我在下面编写的 Google Analytics 4 应用程序脚本代码中工作?我该如何修复它?

尽管 tsconfig 中提供了正确的路径,但仍出现找不到模块错误

我需要聚合两个 MongoDB 集合

将 null 推入管道后,node.js 可写完成未发出

如何使用 Remix 仅在客户端呈现组件?

MongoDB - 查找查询以判断是否存在少量字段,结合字段上的 AND

无法关闭 node.js 中的mongoose 连接

用户通过 oauth2 twitter 授权或通过Passport discord后如何重定向到 React/Vue 路由?

使用 Node.js 在 MongoDB 中搜索

Web3.js 脚本在监听 CreatedPairs 时退出

Node js中向rest服务发送https请求的步骤

适用于 Windows 7 的 NodeJS

webpack css-loader 在外部样式表的 url() 引用中找不到图像

使用 pm2 编程 api 重命名进程

Mongoose - 保存字符串数组

npm install - javascript堆内存不足