Saya memiliki satu komponen yang akan menampilkan Array of String. Kodenya terlihat seperti ini.
React.createClass({
render() {
<div>
this.props.data.map(t => <span>t</span>)
</div>
}
})
Ini bekerja dengan baik. yaitu jika props.data = ['tom', 'jason', 'chris'] Hasil yang diberikan di halaman ini adalah tomjasonchris
Lalu, saya ingin menggabungkan semua nama dengan menggunakan koma, jadi saya ubah kodenya menjadi
this.props.data.map(t => <span>t</span>).join(', ')
Namun, hasil yang diberikan adalah [Objek], [Objek], [Objek].
Saya tidak tahu bagaimana menafsirkan objek menjadi komponen reaksi yang akan diberikan. Ada saran ?
If the array is empty and no initialValue was provided, TypeError would be thrown.
. jadi tidak akan berfungsi untuk array kosong.prev
array. misalnya[1, 2, 3, 4]
menjadi[[[1,",",2],",",3],",",4]
..reduce((prev: JSX.Element, current: JSX.Element): any => [prev, (<span> </span>), current])
Anda dapat menggunakan
reduce
untuk menggabungkan beberapa elemen dari sebuah array:Ini menginisialisasi akumulator dengan null, jadi kita bisa membungkus item pertama dalam sebuah array. Untuk setiap elemen berikut dalam larik, kami membuat larik baru yang berisi semua elemen sebelumnya menggunakan
...-operator
, tambahkan pemisah lalu elemen berikutnya.Array.prototype.reduce ()
sumber
['a'].reduce((a, e) => [...a, ',', e],[])
hasil[",", "a"]
. Meneruskan tidak ada penginisialisasi berfungsi kecuali jika array kosong, dalam hal ini ia mengembalikan TypeError.Perbarui dengan React 16: Sekarang mungkin untuk merender string secara langsung, sehingga Anda dapat menyederhanakan kode Anda dengan menghapus semua
<span>
tag yang tidak berguna .sumber
Jawaban yang diterima sebenarnya mengembalikan array array karena
prev
akan menjadi larik setiap saat. React cukup pintar untuk membuat ini berfungsi, tetapi cenderung menyebabkan masalah di masa depan seperti merusak algoritma Reacts diffing saat memberikan kunci untuk setiap hasil peta.Fitur baru
React.Fragment
memungkinkan kami melakukan ini dengan cara yang mudah dipahami tanpa masalah yang mendasarinya.Dengan
React.Fragment
mudahnya kita menempatkan pemisah di,
luar HTML yang dikembalikan dan React tidak akan mengeluh.sumber
yang
<span>{t}</span>
Anda kembalikan adalah sebuah objek, bukan string. Periksa dokumen reaksi tentang itu https://facebook.github.io/react/docs/jsx-in-depth.html#the-transformDengan menggunakan
.join()
pada larik yang dikembalikan darimap
, Anda bergabung dengan larik objek.[object Object], ...
Anda dapat meletakkan koma di dalamnya
<span></span>
sehingga ditampilkan seperti yang Anda inginkan.Sampel: https://jsbin.com/xomopahalo/edit?html,js,output
sumber
Variasi saya:
sumber
Jika saya hanya ingin membuat array komponen yang dipisahkan koma, saya biasanya merasa
reduce
terlalu bertele-tele. Solusi yang lebih singkat dalam kasus seperti itu adalah{index > 0 && ', '}
akan membuat koma diikuti dengan spasi di depan semua item array kecuali yang pertama.Jika Anda ingin memisahkan item kedua ke terakhir dan terakhir dengan sesuatu yang lain, katakan stringnya
' and '
, Anda dapat menggantinya{index > 0 && ', '}
dengansumber
Menggunakan es6 Anda bisa melakukan sesuatu seperti:
Dan kemudian jalankan:
sumber
Gunakan larik bersarang untuk menyimpan "," di luar.
Optimalkan dengan menyimpan data ke array dan mengubah elemen terakhir daripada memeriksa apakah elemen terakhirnya sepanjang waktu.
sumber
Ini berhasil untuk saya:
sumber
Seperti yang disebutkan oleh Pith , React 16 memungkinkan Anda menggunakan string secara langsung sehingga membungkus string dalam tag span tidak lagi diperlukan. Berdasarkan jawaban Maarten , jika Anda juga ingin menangani pesan khusus segera (dan menghindari kesalahan pada larik kosong), Anda dapat memimpin operasi dengan pernyataan terner if pada properti panjang pada larik. Itu bisa terlihat seperti ini:
sumber
Ini harus mengembalikan array datar. Tangani kasus s dengan objek pertama yang tidak dapat diulang dengan menyediakan larik kosong awal dan memfilter koma pertama yang tidak diperlukan dari hasilnya
sumber
Apakah saya satu-satunya yang berpikir ada banyak penyebaran yang tidak perlu terjadi dalam jawaban di sini? Poin untuk menjadi ringkas, tentu, tetapi membiarkan pintu terbuka untuk masalah skala atau Bereaksi mengubah cara mereka menangani array / Fragmen bersarang.
Satu larik, tidak ada sarang. Tidak ada metode seksi yang merangkai juga, tetapi jika Anda sering melakukan ini, Anda selalu dapat menambahkannya ke prototipe array atau membungkusnya dalam fungsi yang mengambil callback pemetaan juga untuk melakukan semuanya sekaligus.
sumber
sumber