【问题标题】:How to render images with React JS using map or loop?如何使用地图或循环使用 React JS 渲染图像?
【发布时间】:2017-08-16 12:18:20
【问题描述】:

这是我的 js 文件,其中包含我的图像。

import React, { Component } from 'react';
import './Stopka.css';

class Stopka extends Component {
    render() {
        return (
            <div className="container">
                <footer className="row">
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        <h4>Some text</h4>
                    </div>
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        <img src={require("./icons/name1.png")} alt="" className="img-responsive" />
                        <img src={require("./icons/name2.png")} alt="" className="img-responsive" />
                        <img src={require("./icons/name3.png")} alt="" className="img-responsive" />
                        <img src={require("./icons/name4.png")} alt="" className="img-responsive" />
                    </div>
                </footer>
            </div>
        );
    }
}
export default Stopka;

以及渲染它的文件。

import React from 'react';
import ReactDOM from 'react-dom';
import Stopka from './Stopka';
import registerServiceWorker from './registerServiceWorker';



ReactDOM.render(<Stopka />, document.getElementById('stopka'));
registerServiceWorker();

现在我的图像并没有在优化模式下渲染,因为如果我想添加 20 个甚至更多,那会很痛苦。我想用循环或地图功能渲染它。尝试了一些,但它不起作用。你能解释一下我该怎么做吗?

这是我尝试过的。

import React, { Component } from 'react';
import './Stopka.css';

class Stopka extends Component {
    render() {
        let names = ['name1', 'name2', 'name3'];
        for (let i = 0; i < this.props.level; i++) {
            names.push(<image src={require("./icons/"+names+".png")} alt="" className="img-responsive" key={i} />  );
        }
        return (
            <div className="container">
                <footer className="row">
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        <h4>Some text</h4>
                    </div>
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        {names}
                    </div>
                </footer>
            </div>
        );
    }
}


export default Stopka;

再试一次

import React, { Component } from 'react';
import './Stopka.css';

class Stopka extends Component {
    render() {
        let names = ['wood', 'sun'];

        let images = names.map(name => {

            <img
            src = {require("./icons/{name}.png")}
            alt = ""
                className="img-responsive" />
        });
        return (
            <div className="container">
                <footer className="row">
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        <h4>some text</h4>
                    </div>
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        { images }

                    </div>
                </footer>
            </div>
        );
    }
}


export default Stopka;

但这会得到错误“找不到模块:无法解析'./icons/{name}.png'”

【问题讨论】:

  • 你能展示一下你已经做了哪些没用的事情吗?基本上将它们全部作为一个数组并通过它们进行映射就是你所需要的
  • 帖子已编辑,我添加了我所做的。

标签: javascript reactjs


【解决方案1】:

可以结合ES 6 template literals使用js的map函数。

class Stopka extends Component {
    render() {

        const array = ["wood", "lake", "sun", "moon", "sea"];

        const images = array.map(image => {
           return <img key={image} src={require(`./icons/${image}.png`)} className="img-responsive" />
        });

        return (
            <div className="container">
                <footer className="row">
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        <h4>Some text</h4>
                    </div>
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                       { images }
                    </div>
                </footer>
            </div>
        );
    }
}
export default Stopka;

【讨论】:

  • 意外令牌,预期;在 8 号线附近 => 顺便说一句。据我所知,它会渲染文件夹图标中的所有图像?
  • 名称“name1, name2,... name100”只是举例。我怎么能用不同的名字来做呢?像木头、湖泊、太阳、月亮、大海?创建数组并像您一样将其放入 src 中,但在 ${image} 之前没有“名称”?
  • @Brunhilda 不用担心!
  • 有没有办法动态填充数组,使其包含特定文件夹中的所有文件名,包括文件扩展名?
  • @pau1fitzgerald 设法通过组合来自不同答案的代码位来做到这一点function importAll(r) { return r.keys().map(r); } const images = importAll(require.context('static/UniLogo/', false, /\.(png|jpe?g|svg)$/)); const imageArray = images.map(function(image) { return &lt;img key={image} src={image} /&gt;; });
【解决方案2】:

对于和我有同样问题的其他人。这也是工作示例。 我认为键索引更好,因为它不会在控制台中产生错误。 非常适合大型项目。

import React, { Component } from 'react';
import './Stopka.css';

class Stopka extends Component {
    render() {
        let names = ['wood', 'sun', 'moon', 'sea'].map( (name, index) => {
            return <img key={index} className="img-responsive" alt="" src={require(`./icons/${name}.png`)} />
        } );
        return (
            <div className="container">
                <footer className="row">
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        <h4>some text</h4>
                    </div>
                    <div className="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                        { names }

                    </div>
                </footer>
            </div>
        );
    }
}


export default Stopka;

感谢 Paul Fitzgerald 的指导。

【讨论】:

  • @brunhila 我更新了我的答案,还包括一个密钥。虽然我使用了图像,但您应该查看这篇文章,了解为什么不使用 index 作为密钥 medium.com/@robinpokorny/…
  • 太棒了。非常感谢。
猜你喜欢
  • 2019-02-11
  • 2019-01-07
  • 2021-09-12
  • 2020-10-12
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
相关资源
最近更新 更多