Saya mencoba melakukan sesuatu seperti yang berikut di Bereaksi JSX
(di mana ObjectRow adalah komponen yang terpisah):
<tbody>
for (var i=0; i < numrows; i++) {
<ObjectRow/>
}
</tbody>
Saya menyadari dan mengerti mengapa ini tidak valid JSX
, karena JSX
peta berfungsi panggilan. Namun, datang dari tanah templat dan menjadi baru JSX
, saya tidak yakin bagaimana saya akan mencapai di atas (menambahkan komponen beberapa kali).
javascript
reactjs
Ben Roberts
sumber
sumber
let todos = this.props.todos.map((todo) => {return <h1>{todo.title}</h1>})
let todos = this.props.todos.map(t => <h1>{t.title}</h1>)
:)Jawaban:
Anggap saja Anda hanya memanggil fungsi JavaScript. Anda tidak dapat menggunakan
for
loop di mana argumen untuk panggilan fungsi akan:Lihat bagaimana fungsi
tbody
dilewatkanfor
sebagai argumen, dan tentu saja itu adalah kesalahan sintaksis.Tapi Anda bisa membuat array, dan meneruskannya sebagai argumen:
Anda pada dasarnya dapat menggunakan struktur yang sama ketika bekerja dengan JSX:
Kebetulan, contoh JavaScript saya hampir persis seperti apa contoh dari JSX berubah menjadi. Bermain-main dengan Babel REPL untuk merasakan bagaimana JSX bekerja.
sumber
map
(mis. Anda tidak memiliki koleksi yang disimpan dalam variabel).key
untuk setiap childern. REF: facebook.github.io/react/docs/…key
properti dan juga gaya kode yang tidak benar-benar digunakan dalam Bereaksi basis kode. Silakan pertimbangkan jawaban ini stackoverflow.com/questions/22876978/loop-inside-react-jsx/… sebagai jawaban yang benar.Tidak yakin apakah ini akan berhasil untuk situasi Anda, tetapi seringkali peta adalah jawaban yang baik.
Jika ini kode Anda dengan for loop:
Anda bisa menulis seperti ini dengan peta :
Sintaks ES6:
sumber
<tbody>{objects.map((o, i) => <ObjectRow obj={o} key={i}/>}</tbody>
menggunakan dukungan Reactify's ES6 atau Babel.<ul> {objects.map((object:string,i:number)=>{ return <li>{object}</li> })} </ul>
menggunakan TypeScriptfor..in
this.props.order.map((k)=><ObjectRow key={k} {...this.props.items[k]} />)
Jika Anda belum memiliki larik untuk
map()
menyukai jawaban @ FakeRainBrigand, dan ingin menguraikan ini sehingga tata letak sumber terkait dengan keluaran yang lebih dekat daripada jawaban @ SophieAlpert:Dengan sintaksis ES2015 (ES6) (fungsi sebar dan panah)
http://plnkr.co/edit/mfqFWODVy8dKQQOkIEGV?p=preview
Re: transpiling dengan Babel, halaman peringatannya mengatakan bahwa
Array.from
diperlukan untuk menyebar, tetapi saat ini (v5.8.23
) yang tampaknya tidak terjadi ketika menyebarkan yang sebenarnyaArray
. Saya punya masalah dokumentasi yang terbuka untuk mengklarifikasi itu. Tetapi gunakan dengan risiko Anda sendiri atau polyfill.Vanilla ES5
Array.apply
Inline IIFE
http://plnkr.co/edit/4kQjdTzd4w69g8Suu2hT?p=preview
Kombinasi teknik dari jawaban lain
Pertahankan tata letak sumber sesuai dengan output, tetapi buat bagian inline lebih kompak:
Dengan sintaks &
Array
metode ES2015Dengan
Array.prototype.fill
Anda dapat melakukan ini sebagai alternatif untuk menggunakan spread seperti yang diilustrasikan di atas:(Saya pikir Anda benar-benar dapat menghilangkan argumen apa pun
fill()
, tapi saya tidak 100% tentang itu.) Terima kasih kepada @FakeRainBrigand untuk memperbaiki kesalahan saya dalam versifill()
solusi yang lebih lama (lihat revisi).key
Dalam semua kasus,
key
attr mengurangi peringatan dengan build development, tetapi tidak dapat diakses pada anak. Anda dapat melewati attr tambahan jika Anda ingin indeks tersedia pada anak. Lihat Daftar dan Kunci untuk diskusi.sumber
yield
? Mendorong elemen ke array perantara agak jelek ketika kita memiliki generator. Apakah mereka bekerja[...Array(x)].map(() => <El />))
versi, yang saya pikir paling elegan, dan mengapa saya menampilkannya. Re: pertanyaan kedua, itu poin yang bagus. Tampaknya tidak ada apa-apa tentang JSX yang menghalanginya, jadi itu tergantung apa yang React atau konsumen lain dari BEJ berubah lakukan dengan argumen anak-anak, yang saya tidak bisa mengatakan tanpa melihat sumbernya. Apakah anda tahu Ini pertanyaan yang menarik.fill()
. Saya ingat sekarang bahwa alasan saya ragu-ragu tentang itu adalah pertanyaan tentang bagaimana opsionalitas parameter ditunjukkan dalam spesifikasi ES (harus melihat ke dalam itu kapan-kapan). Koma hanyalah cara untuk menghilangkan elemen array - dalam hal ini yang pertama. Anda dapat melakukannya jika Anda ingin indeks berasal dari 1.. panjang array yang Anda sebarkan daripada 0..panjang-1 dari array spread (karena elemen elided hanya berkontribusi pada panjang array dan tidak t memiliki properti yang sesuai).Cukup menggunakan metode map Array dengan sintaks ES6:
Jangan lupakan
key
propertinya.sumber
Menggunakan fungsi peta Array adalah cara yang sangat umum untuk loop melalui array elemen dan membuat komponen sesuai dengan mereka dalam Bereaksi , ini adalah cara yang bagus untuk melakukan loop yang cukup efisien dan rapi untuk melakukan loop Anda di JSX , Ini bukan satu-satunya cara untuk melakukannya, tetapi cara yang disukai.
Juga, jangan lupa memiliki Kunci unik untuk setiap iterasi sebagaimana diperlukan. Fungsi peta membuat indeks unik dari 0 tetapi tidak disarankan menggunakan indeks yang dihasilkan tetapi jika nilai Anda unik atau jika ada kunci unik, Anda dapat menggunakannya:
Juga, beberapa baris dari MDN jika Anda tidak terbiasa dengan fungsi peta di Array:
sumber
Array#map
bukan async!Jika Anda sudah menggunakan lodash,
_.times
fungsinya sangat praktis.sumber
Anda juga dapat mengekstrak di luar blok balik:
sumber
Saya tahu ini adalah utas lama, tetapi Anda mungkin ingin checkout React Templates , yang memungkinkan Anda menggunakan templat gaya jsx dalam bereaksi, dengan beberapa arahan (seperti rt-repeat).
Contoh Anda, jika Anda menggunakan templat reaksi, akan menjadi:
sumber
Ada beberapa cara untuk melakukan ini. JSX akhirnya dikompilasi ke JavaScript, jadi selama Anda menulis JavaScript yang valid, Anda akan baik-baik saja.
Jawaban saya bertujuan untuk menggabungkan semua cara indah yang telah disajikan di sini:
Jika Anda tidak memiliki array objek, cukup jumlah baris:
di dalam
return
blok, membuatArray
dan menggunakanArray.prototype.map
:di luar
return
blok, cukup gunakan JavaScript normal untuk-loop:ekspresi fungsi segera dipanggil:
Jika Anda memiliki berbagai objek
di dalam
return
blok,.map()
setiap objek ke<ObjectRow>
komponen:di luar
return
blok, cukup gunakan JavaScript normal untuk-loop:ekspresi fungsi segera dipanggil:
sumber
jika numrows adalah array, dan itu sangat sederhana.
Jenis data array dalam Bereaksi lebih baik, array dapat mendukung array baru, dan mendukung filter, mengurangi dll.
sumber
Ada beberapa jawaban yang menunjuk menggunakan
map
pernyataan itu. Berikut adalah contoh lengkap menggunakan iterator dalam komponen FeatureList untuk mendaftar komponen Fitur berdasarkan pada struktur data JSON yang disebut fitur .Anda dapat melihat kode FeatureList lengkap di GitHub. The fitur perlengkapan terdaftar di sini .
sumber
Untuk mengulang beberapa kali dan kembali, Anda dapat mencapainya dengan bantuan
from
danmap
:dimana
i = number of times
Jika Anda ingin menetapkan ID kunci unik ke dalam komponen yang diberikan, Anda dapat menggunakan
React.Children.toArray
seperti yang diusulkan di dokumentasi BereaksiReact.Children.toArray
Mengembalikan struktur data buram anak-anak sebagai array datar dengan kunci yang ditetapkan untuk setiap anak. Berguna jika Anda ingin memanipulasi koleksi anak-anak dalam metode render Anda, terutama jika Anda ingin memesan ulang atau mengiris this.props.children sebelum meneruskannya.
sumber
Jika Anda memilih untuk mengkonversi ini dalam kembali () dari render metode, pilihan termudah akan menggunakan peta () metode. Petakan array Anda ke dalam sintaks JSX menggunakan fungsi map (), seperti yang ditunjukkan di bawah ini ( sintaks ES6 digunakan ).
Komponen induk di dalam :
Harap perhatikan
key
atribut yang ditambahkan ke komponen anak Anda. Jika Anda tidak memberikan atribut kunci, Anda dapat melihat peringatan berikut di konsol Anda.Catatan: Satu kesalahan umum yang dilakukan orang adalah menggunakan
index
kunci saat iterasi, penggunaanindex
elemen sebagai kunci adalah anti-pola dan Anda dapat membaca lebih lanjut tentang hal itu di sini . Singkatnya, jika BUKAN daftar statis tidak pernah digunakanindex
sebagai kunci.Sekarang di komponen ObjectRow , Anda dapat mengakses objek dari propertinya.
Di dalam komponen ObjectRow
const { object } = this.props
atau
const object = this.props.object
Ini akan menjemputmu objek yang kamu lewati dari komponen induk ke variabel
object
di komponen ObjectRow . Sekarang Anda dapat memuntahkan nilai-nilai dalam objek itu sesuai dengan tujuan Anda.Referensi :
metode map () dalam Javascript
ECMA Script 6 atau ES6
sumber
katakanlah kami memiliki berbagai item di negara Anda:
sumber
ES2015 / Babel kemungkinan menggunakan fungsi generator untuk membuat array JSX:
sumber
... Atau Anda juga dapat menyiapkan berbagai objek dan memetakannya ke suatu fungsi untuk mendapatkan hasil yang diinginkan. Saya lebih suka ini, karena ini membantu saya untuk menjaga praktik pengkodean yang baik tanpa logika di dalam kembalinya render.
sumber
Cukup gunakan
.map()
untuk mengulang koleksi Anda dan mengembalikan<ObjectRow>
item dengan properti dari setiap iterasi.Dengan asumsi
objects
adalah array di suatu tempat ...sumber
ES2015 Array.dari dengan fungsi + tombol peta
Jika tidak ada yang dapat
.map()
Anda gunakanArray.from()
denganmap
fungsi untuk mengulangi elemen:sumber
Saya menggunakan ini:
PS: jangan pernah lupa kuncinya atau Anda akan memiliki banyak peringatan!
sumber
.Id
properti, sepertiitems.map( (item, index) => <Foo key={index}>{item}</Foo>
Saya cenderung menyukai pendekatan di mana logika pemrograman terjadi di luar nilai kembali
render
. Ini membantu menjaga apa yang sebenarnya mudah grok.Jadi saya mungkin akan melakukan sesuatu seperti:
Memang ini adalah sejumlah kecil kode yang sebaris mungkin berfungsi dengan baik.
sumber
import { map } from 'lodash'
jadi Anda tidak mengimpor semua fungsi lodash jika Anda tidak membutuhkannya.map()
, hanya array. Itulah yang saya katakan lodash baik untuk perulangan objek.objects
dalam daftar hal, kesalahan saya.Anda tentu saja dapat menyelesaikannya dengan .map seperti yang disarankan oleh jawaban lain. Jika Anda sudah menggunakan babel, Anda bisa berpikir tentang menggunakan jsx-control-statement. Mereka memerlukan sedikit pengaturan, tapi saya pikir itu layak dalam hal keterbacaan (terutama untuk pengembang non-reaksi). Jika Anda menggunakan linter, ada juga eslint-plugin-jsx-control-statement
sumber
Kode JSX Anda akan dikompilasi menjadi kode JavaScript murni, tag apa pun akan diganti oleh
ReactElement
objek. Dalam JavaScript, Anda tidak dapat memanggil fungsi beberapa kali untuk mengumpulkan variabel yang dikembalikan.Itu ilegal, satu-satunya cara adalah menggunakan array untuk menyimpan fungsi yang dikembalikan variabel.
Atau Anda dapat menggunakan
Array.prototype.map
yang tersedia sejak JavaScript ES5 untuk menangani situasi ini.Mungkin kita dapat menulis kompiler lain untuk membuat ulang sintaks JSX baru untuk mengimplementasikan fungsi pengulangan seperti milik Angular
ng-repeat
.sumber
Ini dapat dilakukan dengan berbagai cara.
return
menyimpan semua elemen dalam arrayLoop di dalam
return
Metode 1
Metode 2
sumber
Inilah solusi sederhana untuk itu.
Tidak diperlukan pemetaan dan kode kompleks. Anda hanya perlu mendorong baris ke array dan mengembalikan nilai untuk merendernya.
sumber
Karena Anda menulis sintaksis Javascript di dalam kode JSX, Anda perlu membungkus Javascript Anda dalam kurung kurawal.
sumber
Berikut ini contoh dari React doc: JavaScript Expressions as Children
sebagai kasus Anda, saya sarankan menulis seperti ini:
Harap perhatikan bahwa Kunci sangat penting, karena Bereaksi gunakan Kunci untuk membedakan data dalam larik.
sumber
Saya menggunakannya seperti
sumber
Anda dapat melakukan sesuatu seperti:
sumber
Pertanyaan yang bagus
Apa yang saya lakukan ketika saya ingin menambahkan sejumlah komponen adalah menggunakan fungsi pembantu.
Tentukan fungsi yang mengembalikan JSX:
sumber
Anda juga dapat menggunakan fungsi self-invaging:
sumber