react中循环渲染图片,require传参不支持变量

发布于 2022-09-13 00:32:07 字数 688 浏览 12 评论 0

一个页面需要动态渲染这些图片
image.png
img直接使用这种方式
image.png
image.png
查询了一下,需要使用import导入图片
用这种导入是可以的
image.png
但是因为图片很多,需要循环渲染,所以上面这种方式不行,试了下使用require方式
直接写死是可以的
image.png
image.png
但是如果使用变量的话,好像require不支持里面传入的参数为变量,这个应该怎么处理呢
image.png
webpack配置如下
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

水染的天色ゝ 2022-09-20 00:32:07

当使用 require + 表达式时,webpack 在编译阶段并不清楚具体要导入哪个模块,但能分析出符合匹配的所有模块,并且把这些模块的信息整合为一个上下文模块(context module)返回。

也就是说,在调用 require("./images/" + name + ".png") 时返回一个叫上下文模块的东西,包含 images 下所有 png 格式的模块信息。

同时,这个上下文还自带有一些处理模块的方法,比如 keys() 返回一个数组,里面是模块的请求路径,["./images/a.png", "./images/b.png"] 这种,有了具体路径就能拿到具体模块了。

const contextModule = require('./images/' + name + '.png');
contextModule.keys().forEach(key => contextModule(key));  // 使用contextModule 去做 require

等同于

function importAll(r) {
  r.keys().forEach(r);
}
importAll(require('./images/' + name + '.png'));

上面的代码并没有记录下模块引用,没法利用,那么可以用一个载体存着

const cache = {};

function importAll(r) {
  r.keys().forEach((key) => (cache[key] = r(key)));
}

importAll(require('./images/' + name + '.png'));

这样代码里就能根据路径取到某个模块了。

你的代码里应该是用 item.icon 存了图片路径,

如果图片都在同一个目录下管理,那么 icon 可以是图片名称,require(图片目录路径) 并用 cache 存好图片引用,在循环里用 icon 去 cache 取就好了。

如果图片路径差别很大,那么可以用 require.context(正则) 替代 require(目录路径) 自定义一个上下文模块,还是 cache + 循环里 icon 取。这个正则就自由发挥了,能把需要的图片模块都覆盖到就行。

如果你是直接用了 require(item.icon) 那么大概项目中的所有模块都会匹配到,并且被打进包里,所以最好是最小范围的精确匹配。

webpack 文档里相关的内容:https://webpack.docschina.org...

垂暮老矣 2022-09-20 00:32:07

你能直接require图片并不是js提供给你的能力(其实require也不是js提供的,es标准里只有import/export),而是使用webpack打包,webpack loader提供的,通常是url-loader/file-loader(也可以是其他打包工具)
像你这种需求,就需要使用webpack提供的require.context来实现(require表达式在webpack5文档里找了一圈找不到,webpack5里只说import()里可以写表达式,可能reqiure表达式webpack5不支持了)
https://webpack.js.org/api/mo...
(不过通常不建议,因为用了require.context就会自动打包这个目录下所有匹配的资源,不能按需打包,也会失去代码提示的能力)


我的话会直接在定义iconList的时候就把图片require进来

梨涡少年 2022-09-20 00:32:07

早上来试了一下,解决了,非常感谢大佬的帮助,在这里贴出来,供小白使用
image.png
image.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文