Bagaimana saya secara opsional memasukkan elemen dalam JSX? Berikut ini adalah contoh menggunakan spanduk yang seharusnya ada di komponen jika sudah disahkan. Yang ingin saya hindari adalah harus menduplikasi tag HTML dalam pernyataan if.
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
javascript
reactjs
react-jsx
Jack Allan
sumber
sumber
else
cabang, apakah itu berhasil? Saya tidak terbiasa dengan jsx ...Jawaban:
Biarkan saja banner tidak terdefinisi dan tidak disertakan.
sumber
null
berfungsi sama baiknyaundefined
? Apakah bagian dari spek itu bekerja dengan cara ini dan dengan demikian tidak akan pecah di masa depan?Bagaimana dengan ini. Mari kita mendefinisikan
If
komponen bantuan sederhana .Dan gunakan seperti ini:
UPDATE: Karena jawaban saya semakin populer, saya merasa berkewajiban untuk memperingatkan Anda tentang bahaya terbesar yang terkait dengan solusi ini. Seperti yang ditunjukkan dalam jawaban lain, kode di dalam
<If />
komponen dieksekusi selalu terlepas dari apakah kondisinya benar atau salah. Oleh karena itu contoh berikut akan gagal jikabanner
isnull
(perhatikan akses properti di baris kedua):Anda harus berhati-hati saat menggunakannya. Saya sarankan membaca jawaban lain untuk pendekatan alternatif (lebih aman).
UPDATE 2: Melihat ke belakang, pendekatan ini tidak hanya berbahaya tetapi juga sangat sulit. Ini adalah contoh khas ketika seorang pengembang (saya) mencoba untuk mentransfer pola dan pendekatan yang dia tahu dari satu daerah ke daerah lain tetapi tidak benar-benar berfungsi (dalam hal ini bahasa templat lain).
Jika Anda memerlukan elemen kondisional, lakukan seperti ini:
Jika Anda juga membutuhkan cabang lain, cukup gunakan operator ternary:
Itu jauh lebih pendek, lebih elegan dan aman. Saya menggunakannya sepanjang waktu. Satu-satunya kelemahan adalah bahwa Anda tidak dapat melakukan
else if
percabangan semudah itu tetapi itu biasanya tidak umum.Bagaimanapun, ini dimungkinkan berkat cara kerja operator logis dalam JavaScript. Operator logis bahkan memungkinkan trik kecil seperti ini:
sumber
ReactElement
<span>
atau<div>
.Secara pribadi, saya benar-benar berpikir ekspresi terner menunjukkan ( JSX In Depth ) adalah cara paling alami yang sesuai dengan standar ReactJs.
Lihat contoh berikut. Ini agak berantakan pada pandangan pertama tetapi bekerja dengan cukup baik.
sumber
Anda juga dapat menulis seperti itu
Jika Anda
state.banner
adalahnull
atauundefined
, sisi kanan kondisinya dilewati.sumber
The
If
komponen gaya ini berbahaya karena blok kode selalu dieksekusi terlepas dari kondisi tersebut. Sebagai contoh, ini akan menyebabkan nol perkecualian jikabanner
adalahnull
:Opsi lain adalah menggunakan fungsi sebaris (terutama berguna dengan pernyataan lain):
Opsi lain dari masalah reaksi :
sumber
&& + gaya kode + komponen kecil
Sintaks tes sederhana + konvensi gaya kode + komponen kecil yang fokus bagi saya adalah opsi yang paling mudah dibaca di luar sana. Anda hanya perlu merawat nilai-nilai palsu seperti
false
,0
atau""
.lakukan notasi
ES7 stage-0 do notation syntax juga sangat bagus dan saya akan menggunakannya ketika IDE saya mendukungnya dengan benar:
Lebih detail di sini: ReactJs - Membuat komponen "Jika" ... ide yang bagus?
sumber
short-circuit syntax
Sederhana, buat fungsi.
Ini adalah pola yang saya ikuti secara pribadi sepanjang waktu. Membuat kode sangat bersih dan mudah dimengerti. Terlebih lagi itu memungkinkan Anda untuk refactor
Banner
ke komponennya sendiri jika terlalu besar (atau digunakan kembali di tempat lain).sumber
do
Sintaks ES7 eksperimental membuatnya mudah. Jika Anda menggunakan Babel, aktifkanes7.doExpressions
fitur itu:Lihat http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions
sumber
Seperti yang telah disebutkan dalam jawaban, JSX memberi Anda dua opsi
Operator ternary
{ this.state.price ? <div>{this.state.price}</div> : null }
Kata hubung logis
{ this.state.price && <div>{this.state.price}</div> }
Namun, itu tidak berhasil
price == 0
.JSX akan membuat cabang palsu dalam kasus pertama dan dalam kasus konjungsi logis, tidak ada yang akan diberikan. Jika properti mungkin 0, gunakan saja pernyataan di luar JSX Anda.
sumber
typeof(this.state.price) === "number"
sebagai kondisinya (dalam kedua varian).Komponen ini berfungsi ketika Anda memiliki lebih dari satu elemen di dalam cabang "jika":
Pemakaian:
Ps seseorang berpikir bahwa komponen ini tidak baik untuk membaca kode. Tetapi dalam pikiran saya, Html dengan javascript lebih buruk
sumber
Sebagian besar contoh adalah dengan satu baris "html" yang diterjemahkan secara kondisional. Ini sepertinya terbaca bagi saya ketika saya memiliki beberapa baris yang perlu diterjemahkan secara kondisional.
Contoh pertama adalah baik karena alih-alih
null
kita dapat membuat beberapa konten lain seperti{this.props.showContent ? content : otherContent}
Tetapi jika Anda hanya perlu menampilkan / menyembunyikan konten ini bahkan lebih baik karena Boolean, Null, dan Undefined Diabaikan
sumber
Ada solusi lain, jika komponen untuk Bereaksi :
sumber
Saya menggunakan pintasan yang lebih eksplisit: Ekspresi Fungsi yang Segera Dibawa (IIFE):
sumber
Saya membuat https://www.npmjs.com/package/jsx-control-statements untuk membuatnya sedikit lebih mudah, pada dasarnya itu memungkinkan Anda untuk mendefinisikan
<If>
conditional sebagai tag dan kemudian mengkompilasinya menjadi ternary ifs sehingga kode di dalam<If>
hanya mendapat dieksekusi jika kondisinya benar.sumber
Ada juga versi satu baris yang sangat bersih ... {this.props.product.title || "Tanpa judul" }
Yaitu:
sumber
Saya membuat https://github.com/ajwhite/render-if baru-baru ini untuk membuat elemen secara aman hanya jika predikat lolos .
atau
sumber
Anda dapat memasukkan elemen secara kondisional menggunakan operator ternary seperti:
sumber
Anda dapat menggunakan fungsi dan mengembalikan komponen dan menjaga tipis fungsi rendering
sumber
Inilah pendekatan saya menggunakan ES6.
Demo: http://jsfiddle.net/kb3gN/16688/
Saya menggunakan kode seperti:
Itu akan membuat
SomeElement
hanya jikaopened
itu benar. Ini bekerja karena cara JavaScript menyelesaikan kondisi logis:Seperti yang
React
akan diabaikanfalse
, saya menemukan cara yang sangat baik untuk membuat beberapa elemen bersyarat.sumber
Mungkin ini membantu seseorang yang menemukan pertanyaan: Semua rendering Bersyarat dalam Bereaksi Ini adalah artikel tentang semua opsi berbeda untuk rendering bersyarat dalam Bereaksi.
Pengambilan kunci kapan harus menggunakan rendering bersyarat mana:
** jika lain
** operator ternary
** logis operator &&
** beralih kasus
** enum
** rendering bersyarat multi-level / bersarang
** HOC
** komponen templating eksternal
sumber
Dengan ES6, Anda dapat melakukannya dengan one-liner sederhana
"show" adalah boolean dan Anda menggunakan kelas ini oleh
sumber
Saya tidak berpikir ini telah disebutkan. Ini seperti jawaban Anda sendiri tetapi saya pikir ini lebih sederhana. Anda selalu dapat mengembalikan string dari ekspresi dan Anda bisa membuat jsx di dalam ekspresi, jadi ini memungkinkan untuk ekspresi inline yang mudah dibaca.
sumber
Saya suka dengan explicitness dari Function Function-Unlimited Function Expressions (
IIFE
) danif-else
berulangrender callbacks
-ulangternary operators
.Anda hanya perlu membiasakan diri dengan
IIFE
sintaks,{expression}
adalah sintaks React yang biasa, di dalamnya hanya mempertimbangkan bahwa Anda sedang menulis sebuah fungsi yang memanggil dirinya sendiri.yang perlu dibungkus dalam parens
sumber
Ada juga teknik menggunakan render props untuk mengkondisikan render komponen. Manfaatnya adalah bahwa render tidak akan mengevaluasi sampai kondisi terpenuhi, sehingga tidak ada kekhawatiran untuk nilai nol dan tidak ditentukan .
sumber
Ketika harus hanya membuat sesuatu jika kondisi yang berlalu terpenuhi, Anda dapat menggunakan sintaks:
Kode dengan cara ini akan terlihat seperti ini:
Ada, tentu saja, cara lain yang sah untuk melakukan ini, semua terserah preferensi dan kesempatan. Anda dapat mempelajari lebih banyak cara tentang cara melakukan rendering bersyarat dalam Bereaksi dalam artikel ini jika Anda tertarik!
sumber
Hanya untuk menambahkan opsi lain - jika Anda suka / mentolerir skrip kopi, Anda dapat menggunakan kopi-reaksi untuk menulis BEJ Anda dalam hal ini, jika pernyataan selain dapat digunakan karena merupakan ekspresi dalam skrip kopi dan bukan pernyataan:
sumber
Hanya untuk memperluas jawaban @Jack Allan dengan referensi ke dokumen.
Bereaksi dokumentasi dasar (Mulai Cepat) menyarankan
null
dalam kasus seperti itu. Namun, Booleans, Null, dan Undefined Diabaikan juga, disebutkan dalam panduan Tingkat Lanjut.sumber