วิธีการวนซ้ำและแสดงองค์ประกอบใน React.js โดยไม่ต้องอาร์เรย์ของวัตถุที่จะทำแผนที่?


145

ฉันพยายามแปลงองค์ประกอบ jQuery เป็น React.js และสิ่งหนึ่งที่ฉันมีปัญหาคือการแสดงองค์ประกอบจำนวน n ตามการวนรอบ

mapผมเข้าใจในเรื่องนี้เป็นไปไม่ได้หรือแนะนำและว่าที่อาร์เรย์ที่มีอยู่ในรูปแบบมันทำให้รู้สึกที่สมบูรณ์ในการใช้งาน ไม่เป็นไร แต่ถ้าคุณไม่มีอาเรย์ล่ะ? แต่คุณมีค่าตัวเลขซึ่งเท่ากับจำนวนองค์ประกอบที่กำหนดที่จะแสดงดังนั้นคุณควรทำอย่างไร

นี่คือตัวอย่างของฉันฉันต้องการนำหน้าองค์ประกอบที่มีแท็ก span จำนวนเท่าใดก็ได้ตามระดับของลำดับชั้น ดังนั้นที่ระดับ 3 ฉันต้องการแท็ก 3 ส่วนต่อหน้าองค์ประกอบข้อความ

ในจาวาสคริปต์:

for (var i = 0; i < level; i++) {
    $el.append('<span class="indent"></span>');
}
$el.append('Some text value');

ฉันไม่สามารถรับสิ่งนี้ได้หรือสิ่งใดที่คล้ายคลึงกับการทำงานในองค์ประกอบ JSX React.js แต่ฉันต้องทำสิ่งต่อไปนี้ก่อนอื่นให้สร้างอาร์เรย์ชั่วคราวตามความยาวที่ถูกต้องแล้ววนลูปอาร์เรย์

React.js

render: function() {
  var tmp = [];
  for (var i = 0; i < this.props.level; i++) {
    tmp.push(i);
  }
  var indents = tmp.map(function (i) {
    return (
      <span className='indent'></span>
    );
  });

  return (
    ...
    {indents}
    "Some text value"
    ...
  );
}

แน่นอนว่านี่จะไม่ใช่วิธีที่ดีที่สุดหรือเป็นวิธีเดียวที่จะบรรลุเป้าหมายนี้ ฉันพลาดอะไรไป



นอกจากนี้คุณยังสามารถทำเช่นนั้นได้: jsfiddle.net/crl/69z2wepo/19804
caub

คำตอบ:


241

อัปเดต: ตั้งแต่วันที่ทำปฏิกิริยา> 0.16

เมธอด Render ไม่จำเป็นต้องส่งคืนองค์ประกอบเดียว สามารถส่งคืนอาร์เรย์ได้

var indents = [];
for (var i = 0; i < this.props.level; i++) {
  indents.push(<span className='indent' key={i}></span>);
}
return indents;

หรือ

return this.props.level.map((item, index) => (
    <span className="indent" key={index}>
        {index}
    </span>
));

เอกสารที่นี่อธิบายเกี่ยวกับเด็ก ๆ ของ JSX


อายุ:

คุณสามารถใช้หนึ่งวงแทน

var indents = [];
for (var i = 0; i < this.props.level; i++) {
  indents.push(<span className='indent' key={i}></span>);
}
return (
   <div>
    {indents}
    "Some text value"
   </div>
);

คุณยังสามารถใช้. map และ fancy es6

return (
   <div>
    {this.props.level.map((item, index) => (
       <span className='indent' key={index} />
    ))}
    "Some text value"
   </div>
);

นอกจากนี้คุณต้องห่อค่าส่งคืนในคอนเทนเนอร์ ฉันใช้ div ในตัวอย่างด้านบน

ตามที่เอกสารบอกไว้ที่นี่

ขณะนี้ในการแสดงผลของส่วนประกอบคุณสามารถส่งคืนได้เพียงหนึ่งโหนดเท่านั้น หากคุณมีพูดรายการ divs ที่จะส่งคืนคุณต้องล้อมรอบส่วนประกอบของคุณภายใน div, span หรือส่วนประกอบอื่น ๆ


1
ใช้งานได้และมันง่ายกว่ามากขอบคุณ ใช่ฉันรู้ว่าคุณต้องห่อค่าส่งคืนในคอนเทนเนอร์ฉันทำแล้วมันหายไปจากตัวอย่าง
Jonathan Miles

2
เพิ่มปุ่มภายในวง กุญแจมีความสำคัญในการตอบสนอง
Aamir Afridi

4
ฉันได้ค้นหาคุณตลอดชีวิตของฉัน
olleh

2
@ElgsQianChen มันเป็นไปไม่ได้ ต้องห่อด้วยแท็กบางส่วน ถ้า {indents} ส่งคืนองค์ประกอบ dom เดียวที่มีเนื้อหาอยู่ภายในก็
ถือว่าใช้ได้

2
ฉันไม่เข้าใจว่าทำไมถึงมีการพูดถึงวิธีการแมปในคำตอบนี้เพราะมันใช้ได้กับวัตถุ Array เท่านั้นซึ่งคำถามที่ระบุอย่างชัดเจนไม่ใช่กรณี
flukyspore

47

นี่คือตัวอย่างการทำงานที่มีคุณสมบัติ ES6 บางอย่างมากขึ้น:

'use strict';

const React = require('react');

function renderArticles(articles) {
    if (articles.length > 0) {      
        return articles.map((article, index) => (
            <Article key={index} article={article} />
        ));
    }
    else return [];
}

const Article = ({article}) => {
    return ( 
        <article key={article.id}>
            <a href={article.link}>{article.title}</a>
            <p>{article.description}</p>
        </article>
    );
};

const Articles = React.createClass({
    render() {
        const articles = renderArticles(this.props.articles);

        return (
            <section>
                { articles }
            </section>
        );
    }
});

module.exports = Articles;

1
นี่เป็นวิธีที่ 'ทำปฏิกิริยา' มากที่สุดในการทำ ส่งค่าเป็นอุปกรณ์ประกอบฉากไปยังส่วนประกอบย่อยอื่น ขอบคุณ!
Michael Giovanni Pumo

นี่มันยอดเยี่ยมมาก! สมบูรณ์แบบสำหรับเมื่อเรนเดอร์ของคุณ () หนัก html
matthew

เพื่อให้มี ES6 มากขึ้นคุณสามารถใช้import React from "react"และexport default Articles
jonlink

1
คำตอบนี้ไม่แม้แต่จะพยายามตอบคำถาม คำถามนั้นชัดเจนวิธีการแปลงเป็นfor loopอาร์เรย์ map'able (หรือวัตถุ) เพื่อแสดงจำนวนของรายการในองค์ประกอบการทำปฏิกิริยาโดยไม่ต้องมีอาร์เรย์ของรายการ วิธีการแก้ปัญหาของคุณจะไม่สนใจข้อเท็จจริงและสมมติว่ามีการส่งบทความมากมายจากอุปกรณ์ประกอบฉาก
Jonathan Miles

17

ฉันใช้Object.keys(chars).map(...)การวนรอบในการเรนเดอร์

// chars = {a:true, b:false, ..., z:false}

render() {
    return (
       <div>
        {chars && Object.keys(chars).map(function(char, idx) {
            return <span key={idx}>{char}</span>;
        }.bind(this))}
        "Some text value"
       </div>
    );
}

คำตอบของคุณใช้ได้สำหรับฉัน แต่หลังจากที่ฉันเพิ่มchars && ...และ.bind(this)เมื่อสิ้นสุดการทำงานของฉัน ฉันสงสัยว่าทำไมเพียงObject...(ต่อ ๆ ไป) ไม่ได้ผล ฉันยังไม่ได้กำหนด
m00saca

2
สิ่งนี้ไม่ได้ตอบคำถามมันบอกว่าโดยไม่ต้องมีอาร์เรย์ของวัตถุในการแยกวิเคราะห์และคำอธิบายอย่างชัดเจนบอกว่าฉันต้องการแปลงลูปเป็นลูปเป็นแม็พสำหรับแสดงผลในส่วนประกอบรีแอค คุณแทนที่อาร์เรย์สำหรับวัตถุที่ไม่ได้ช่วยตอบคำถามหรือเพิ่มค่าใด ๆ เพิ่มเติม
Jonathan Miles

16

Array.from()ใช้วัตถุ iterable เพื่อแปลงเป็นอาร์เรย์และฟังก์ชั่นแผนที่เสริม คุณสามารถสร้างวัตถุที่มี.lengthคุณสมบัติดังนี้

return Array.from({length: this.props.level}, (item, index) => 
  <span className="indent" key={index}></span>
);

ฉันเพิ่งเห็นคำถามของคุณหลังจากฟังเมื่อสัปดาห์ที่แล้วดังนั้นมันจึงเป็นวิธีที่รวดเร็วที่สุดในการนำสิ่งที่ฉันเรียนรู้มาใช้! syntax.fm/show/043/…
conradj

1
สิ่งที่ฉันต้องการสำหรับการแสดงองค์ประกอบจำนวน X ขอขอบคุณ!
Liran H

0

ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดในการวนซ้ำ js

<ul>
    {yourarray.map((item)=><li>{item}</li>)}
</ul>

2
สิ่งนี้ไม่ตอบคำถามโปรดอ่านคำถามโดยละเอียดก่อนพยายามตอบ
Jonathan Miles

มันช่วยฉันและประหยัดเวลาของฉัน
Ajay Malhotra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.