【问题标题】:What would be a good way to loop all images in a folder in React?在 React 的文件夹中循环所有图像的好方法是什么?
【发布时间】:2019-07-18 15:18:49
【问题描述】:

我的文件夹中有一些图像,我尝试循环播放它。例如,一个名为“coupons”的文件夹有一些图像,如“coupon1.png”、“coupon2.png”、“coupon3.png”...... 然后在一个组件中,我尝试创建一个函数来导入所有图像并返回

<img src={coupon1} alt='coupon1' className="slide" />
<img src={coupon2} alt='coupon2' className="slide" />
<img src={coupon3} alt='coupon3' className="slide" />
.....

我可以知道什么是这样做的好方法吗?如何避免一张一张导入图片?以及如何获取文件夹中图片文件的总数?

import coupon1 from '../assets/coupons/coupon1.png';
import coupon2 from '../assets/coupons/coupon2.png';
import coupon3 from '../assets/coupons/coupon3.png';
...

以及如何循环它们?我尝试使用模板字符串,但它以字符串而不是变量结尾,所以仍然无法正常工作。非常感谢!

【问题讨论】:

    标签: javascript webpack react-create-app


    【解决方案1】:

    您有 3 个选项:

    1) 您可以使用 webpack 并通过文件列表生成别名。

    webpack.config.js

    const webpack = require('webpack');
    const child_process = require('child_process');
    let stdout = child_process.execSync("find . -regex  '.*\\(png\\|jgeg\\)$'", {encoding: 'utf8'});
    let files = stdout.split('\n');
    
    
    module.exports = {
        plugins = [
            new webpack.DefinePlugin({
                IMAGES: JSON.stringify(files),
            }),
        ];
    } 
    

    index.js

    Promise.all(
        files.map(a => import(a))
    ).then(
        filesSources => console.log(`DO something with array: ${filesSources}`)
    );
    

    2) 您可以要求带有上下文的图像:

    index.js

    list = require.context('./', false, /\.(png|jpeg)$/);
    

    3) 如果您不需要使用源代码,您可以使用 copyWebpackPLugin:

    webpack.config.js

    const CopyWebpackPlugin = require('copy-webpack-plugin');
    new CopyWebpackPlugin([
      {from: './src/assets/images', to: 'images'},
     ]),
    

    注意 3) 案例图像不会被 webpack 加载器链处理。在前两种情况下,您需要为 FileLoader 添加规则。你可以在https://github.com/akoidan/pychat/tree/master/fe找到3个案例的例子

    【讨论】:

    • 非常感谢!请问如何获取文件夹中的图片文件总数?
    • array.length?)
    • 谢谢!所以导入数组中的所有图像然后使用 .length 对吗?
    • const slides = Array(6).fill().map((item, i) => ( ../assets/coupons/coupon${i + 1}.png)} className="幻灯片" />));我可以知道这里的要求是什么意思吗?它也来自webpack吗?非常感谢!
    【解决方案2】:

    哦,我刚刚找到了这样的方法:

    const slides = Array(6).fill().map((item, i) => (
                <img key={i} src={require(`../assets/coupons/coupon${i + 1}.png`)} className="slide" />
            ));
    

    但我不确定这是不是一个好方法?在 jsx 中使用 require 的语法是什么?我可以知道为什么在这里使用 require 有任何解释吗?

    【讨论】:

    • 有效吗?只有动态导入可以在(函数的)范围内
    • @deathangel908 是的,它可以工作,但我不知道为什么我们在这里使用 require ?我认为 require 是 nodejs 或 webpack 方式?我可以知道有没有办法以这种方式获取文件编号?所以我不需要使用Array(某些数字).fill()。非常感谢
    • 这里没有运行节点。 Node 只支持 webpack,webpack 不运行你的源文件,它只处理它们。含义 webpack 默认使用 commonJs 解析策略,注意它与 ES6/TS/ES3 语法(import/require 等)无关。它到底是做什么的,需要在你的源代码中查找并从中生成 webpack-modules,通过之前的加载器运行它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2015-06-09
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多