Apakah ada cara untuk hanya menambahkan atribut ke komponen Bereaksi jika kondisi tertentu terpenuhi?
Saya seharusnya menambahkan atribut yang diperlukan dan readOnly untuk membentuk elemen berdasarkan panggilan Ajax setelah render, tapi saya tidak bisa melihat bagaimana menyelesaikannya karena readOnly = "false" tidak sama dengan menghilangkan atribut sepenuhnya.
Contoh di bawah ini harus menjelaskan apa yang saya inginkan, tetapi itu tidak akan berfungsi (Parse Error: Unexpected identifier).
var React = require('React');
var MyOwnInput = React.createClass({
render: function () {
return (
<div>
<input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
</div>
);
}
});
module.exports = React.createClass({
getInitialState: function () {
return {
isRequired: false
}
},
componentDidMount: function () {
this.setState({
isRequired: true
});
},
render: function () {
var isRequired = this.state.isRequired;
return (
<MyOwnInput name="test" {isRequired ? "required" : ""} />
);
}
});
javascript
reactjs
Remi Sture
sumber
sumber
aria-modal=true
, Anda mendorong perubahan (ke false) ke penyimpanan atribut aria / data , tetapi tidak ada yang lain yang diubah (seperti konten komponen atau kelas atau variabel di sana) karena hasilnya ReactJs tidak akan memperbarui aria / attr data dalam komponen itu. Saya telah bermain-main sepanjang hari untuk menyadari hal itu.Jawaban:
Rupanya, untuk atribut tertentu, Bereaksi cukup cerdas untuk menghilangkan atribut jika nilai yang Anda berikan tidak benar. Sebagai contoh:
akan menghasilkan:
Pembaruan: jika ada yang ingin tahu bagaimana / mengapa ini terjadi, Anda dapat menemukan detail dalam kode sumber ReactDOM, khususnya pada baris 30 dan 167 dari file DOMProperty.js .
sumber
null
berarti "bertindak seperti saya tidak menentukannya sama sekali". Untuk atribut dom boolean true / false lebih disukai daripada mengulangi nama atribut / false, misalnya<input disabled>
kompilasi keReact.createElement('input', {disabled: true})
="required"
bagian itu. Chrome sebenarnya membuat hanya atribut tanpa nilai.readonly
tidak pernah ditambahkan karena React mengharapkan atributreadOnly
(dengan modal O).alt={props.alt || null}
.false
, tetapi hanyanull
memastikan atribut itu benar-benar dihapus.Jawaban juandemarco biasanya benar, tetapi di sini ada pilihan lain.
Bangun objek sesuka Anda:
Jadikan menyebar, secara opsional juga meloloskan alat peraga lainnya.
sumber
_extends
telah ditambahkan ke dalamnya, yang akan (dalam keadaan normal) mengambilprops
konstruksi dari "atribut normal" dan berlakuObject.assign(props, inputProps)
.Berikut adalah contoh penggunaan Bootstrap 's
Button
melalui Bereaksi-Bootstrap (versi 0.32.4):Bergantung pada kondisinya, dapat
{bsStyle: 'success'}
atau{}
akan dikembalikan. Operator spread kemudian akan menyebarkan properti dari objek yang dikembalikan keButton
komponen. Dalam kasus falsy, karena tidak ada properti pada objek yang dikembalikan, tidak ada yang akan diteruskan ke komponen.Cara alternatif berdasarkan komentar Andy Polhill :
Satu-satunya perbedaan kecil adalah bahwa dalam contoh kedua komponen dalam
<Button/>
'sprops
objek akan memiliki kuncibsStyle
dengan nilaiundefined
.sumber
{bsStyle: 'success'}
atau{}
hasil darinya), kemudian objek tersebut menyebar.<Button bsStyle={ condition ? 'success': undefined } />
saya menemukan sintaks sedikit lebih mudah, melewatiundefined
akan menghilangkan properti.<Button/>
'sprops
objek akan memiliki kuncibsStyle
dengan nilaiundefined
.Berikut ini sebuah alternatif.
Atau versi inline-nya
sumber
condition
salah, ini akan mencoba untuk memperluas / beralih ke false, yang menurut saya tidak benar.false
tidak ada. Cek saja dengan Babel. Ini bekerja dengannya ketikacondition
dievaluasi menjadi false karena cara Babel mengimplementasikan operator. Meskipun solusi sepele bisa jadi...( condition ? { disabled: true } : {} )
, itu menjadi sedikit bertele-tele kemudian. Terima kasih atas masukan yang bagus ini!data-*
atauaria-*
atribut secara kondisional , karena merupakan kasus khusus di BEJ, sehinggadata-my-conditional-attr={ false }
akan menampilkandata-my-conditional-attr="false"
daripada menghilangkan atribut. facebook.github.io/react/docs/dom-elements.htmlInilah cara saya melakukannya.
Dengan syarat :
Saya masih lebih suka menggunakan cara biasa untuk menurunkan props, karena lebih mudah dibaca (menurut saya) dalam kasus tidak memiliki persyaratan.
Tanpa syarat :
sumber
...(tooltip && { tooltip }),
? Itu bekerja pada komponen tetapi ketika saya mencoba menggunakan sesuatu seperti ini dalam kode saya mendapatkan kesalahan yang berarti bahwa saya mencoba untuk menyebarkan nilai yang tidak dapat diubahfalseyValue && {}
akan mengembalikan false, sehingga kemungkinan Anda menyebarkan false misalnya...(false)
. jauh lebih baik untuk menggunakan ekspresi penuh sehingga penyebaran terus berperilaku...(condition ? {foo: 'bar'} : {})
Anda dapat menggunakan pintasan yang sama, yang digunakan untuk menambah / menghapus (bagian dari) komponen (
{isVisible && <SomeComponent />}
).sumber
someCondition
benar tetapisomeValue
salah (mis. Itufalse
sendiri, atau0
, dll.), Apakah atribut masih disertakan? Ini penting jika perlu untuk secara eksplisit memasukkan nilai falsy, misalnya a0
untuk atribut koordinat, dll.data-*
danaria-*
, lihat komentar saya di atas. Jika Anda mengutip nilainya, atau melemparkannya sebagai sebuah String, atribut tersebut akan menampilkan: egsomeAttr={ `${falsyValue}` }
bisasomeAttr="false"
Katakanlah kita ingin menambahkan properti khusus (menggunakan aria- * atau data- *) jika kondisinya benar:
Katakanlah kita ingin menambahkan properti gaya jika kondisinya benar:
sumber
Jika Anda menggunakan ECMAScript 6, Anda cukup menulis seperti ini.
sumber
Ini akan berfungsi, karena status Anda akan berubah setelah panggilan Ajax, dan komponen induk akan di-render ulang.
sumber
Di Bereaksi Anda dapat membuat Komponen secara kondisional, tetapi juga atributnya, seperti alat peraga, className, id, dan banyak lagi.
Dalam Bereaksi itu praktik yang sangat baik untuk menggunakan operator ternary yang dapat membantu Anda membuat Komponen secara kondisional.
Contoh juga menunjukkan bagaimana membuat Komponen dan atribut style-nya secara kondisional.
Ini adalah contoh sederhana:
sumber
Mempertimbangkan pos JSX Dalam Kedalaman , Anda dapat memecahkan masalah Anda dengan cara ini:
sumber