【发布时间】:2020-08-18 20:17:08
【问题描述】:
我是 React 新手,我正在尝试创建一个涉及卡片的游戏,其中 websocket 返回一组卡片名称,并在前端从本地图像目录生成正确的卡片图像。从 websocket 返回的卡片名称与图像的文件名匹配,例如“map”对应于图像“map.jpg”。我正在尝试映射数组并为数组中的每个卡名创建一个图像标签。我读到最好的方法是使用require(),所以我尝试做类似的事情
//inside component
let cardImgs;
...
socket.on(RECEIVED_STARTING_HAND, (hand) => {
cardImgs = hand.map(cardName => <img src= {require(`../../card_images/${cardName}.jpg`)}/>
})
...所以稍后在我的组件中我可以做这样的事情:
return (
<div>
<h1>My hand</h1>
{cardImgs}
</div>
...
)
但是,cardImgs 不会呈现。在我的组件的return 声明中,我测试了直接渲染图像并且它可以工作,例如
const map = "map"
return (
<div>
<h1>My hand</h1>
{cardImgs}
</div>
...
//this one renders!!!
<img src={require(`../../card_images/${map}.jpg`)} />
)
我使用 Create-React-App 创建了我的 react 应用程序,我读了一些内容说我应该重新配置我的 webpack.config.js 文件,但是我也读了一些内容说我不应该碰它,除非我需要。我不确定为什么require() 在我的组件的return 语句中起作用,但在给定图像标签数组时它不起作用。我是否遗漏了什么,或者您对在 React 中动态加载图像的更好方法有什么建议?谢谢!
【问题讨论】:
-
使用肯定会有帮助的导入。
-
我有大约 40 张图片,我想根据给定的卡片动态加载图片。拥有 40 个导入语句只会变得混乱。我希望有一个替代方案。
-
require 在反应中不起作用,我能想到的唯一其他方法是将图像托管在 AWS 或 Azure 等云中,然后您可以动态加载它。
-
有:将您的静态资产作为静态资产托管,而不是尝试将它们捆绑在一起。尤其是如果数据不会每半天更改一次,例如图片或网站 CSS 或 webfonts。然后使用
<img>组件加载它们,因为这就是img元素的用途。 -
@Mike 'Pomax' Kamermans 你能举个例子吗?您的意思是将它们作为静态资产托管在云中吗?
标签: javascript reactjs create-react-app