Di Bereaksi, Anda dapat dengan jelas membuat objek dan menetapkannya sebagai gaya sebaris. yaitu. disebutkan di bawah.
var divStyle = {
color: 'white',
backgroundImage: 'url(' + imgUrl + ')',
WebkitTransition: 'all', // note the capital 'W' here
msTransition: 'all' // 'ms' is the only lowercase vendor prefix
};
var divStyle2 = {fontSize: '18px'};
React.render(<div style={divStyle}>Hello World!</div>, mountNode);
Bagaimana saya bisa menggabungkan beberapa objek dan menetapkannya bersama?
Jawaban:
Jika Anda menggunakan React Native, Anda dapat menggunakan notasi array:
Lihat posting blog saya yang terperinci tentang ini.
sumber
<View style={this.state.error == false ? styles.base : [styles.base, {backgroundColor: 'red'}]} />
StyleSheet.compose()
luar fungsi render mungkin lebih efisien. Ini akan menghasilkan stylesheet statis baru yang hanya akan dikirim melalui jembatan sekali. (Saran ini tidak berlaku untuk gaya yang berubah saat runtime, atau yang sebaris bukan dalam StyleSheet.)Anda dapat menggunakan operator spread:
sumber
<div style={{ ...LEGEND_STYLE.box_base, ...{ 'background': '#123456' } }} />
<div style={LEGEND_STYLE.box_gen('#123456')}
, jadi itu bukan masalah besar bagi sayaAnda dapat melakukannya dengan
Object.assign()
.Dalam contoh Anda, Anda akan melakukan:
Itu akan menggabungkan dua gaya. Gaya kedua akan menggantikan yang pertama jika ada properti yang cocok.
Seperti dicatat Brandon, Anda harus menggunakan
Object.assign({}, divStyle, divStyle2)
jika Anda ingin menggunakan kembalidivStyle
tanpa fontSize diterapkan untuk itu.Saya suka menggunakan ini untuk membuat komponen dengan properti default. Sebagai contoh, inilah komponen stateless kecil dengan default
margin-right
:Jadi kita dapat membuat sesuatu seperti ini:
Yang akan memberi kita hasilnya:
sumber
Object.assign()
dengan cara yang akan mengarah pada beberapa konsekuensi yang tidak diinginkan. Lihat jawabannya di sini solusi yang lebih andal.Object.assign()
jawaban Anda. yang pertama, dalam beberapa kalimat pertama, adalah contoh penyalahgunaan yang saya identifikasi (yaitu, jika OP melakukan apa yang Anda sarankan dicode
blok pertama Anda , dia akan bermutasi{divStyle}
). cara kedua - yaitu, membungkusnya dalam fungsi seperti yang Anda miliki, akan berhasil, tetapi jawabannya tidak menjelaskan bahwa Anda sedang bekerja di sekitarObject.assign()
immutabilitas wrt 'gotcha' yang umum (meskipun secara pribadi saya pikir itu sedikit rumit untuk menulis fungsi stateless khusus untuk setiap komponen default).Tidak seperti Bereaksi Asli, kami tidak dapat meneruskan larik gaya di Bereaksi
Dalam Bereaksi, kita perlu membuat objek tunggal gaya sebelum meneruskannya ke properti gaya. Suka:
Kami telah menggunakan operator ES6 Spread untuk menggabungkan dua gaya. Anda juga bisa menggunakan Object.assign () juga untuk tujuan yang sama.
Ini juga berfungsi jika Anda tidak perlu menyimpan gaya Anda dalam var
sumber
Object.assign()
adalah solusi yang mudah, tetapi (saat ini) jawaban atas penggunaannya - walaupun baik untuk membuat komponen stateless, akan menyebabkan masalah bagi tujuan OP yang diinginkan untuk menggabungkan duastate
objek.Dengan dua argumen,
Object.assign()
sebenarnya akan bermutasi objek pertama di tempat, mempengaruhi instantiations masa depan.Ex:
Pertimbangkan dua kemungkinan konfigurasi gaya untuk sebuah kotak:
Jadi kami ingin semua kotak kami memiliki gaya 'kotak' default, tetapi ingin menimpa beberapa dengan warna yang berbeda:
Setelah
Object.assign()
dieksekusi, objek 'styles.box' diubah untuk selamanya.Solusinya adalah dengan mengirimkan objek kosong ke
Object.assign()
. Dengan demikian, Anda memberi tahu metode untuk menghasilkan objek BARU dengan objek yang Anda lewati. Seperti itu:Gagasan objek bermutasi di tempat sangat penting untuk Bereaksi, dan penggunaan yang tepat
Object.assign()
sangat membantu untuk menggunakan perpustakaan seperti Redux.sumber
Array notaion adalah cara terbaik untuk menggabungkan gaya dalam reaksi asli.
Ini menunjukkan cara menggabungkan 2 objek Style,
ini menunjukkan cara menggabungkan objek Style dan properti,
Ini akan bekerja pada aplikasi asli apa pun yang bereaksi.
sumber
React
, bukanReact Native
Anda juga dapat menggabungkan kelas dengan gaya inline seperti ini:
sumber
Sebenarnya, ada cara formal untuk menggabungkan dan seperti di bawah ini:
Tapi, ada masalah kecil , jika salah satunya dilewatkan oleh komponen induk dan itu dibuat dengan cara formal gabungan kita punya masalah besar:
Dan baris terakhir ini menyebabkan bug UI, bermuka masam, React Native tidak dapat menangani array yang dalam di dalam array. Jadi saya membuat fungsi pembantu saya:
Dengan menggunakan saya di
styleJoiner
mana saja Anda dapat menggabungkan semua jenis gaya dan menggabungkan gaya. bahkanundefined
atau tipe tidak berguna lainnya tidak menyebabkan penataan yang rusak.sumber
Saya telah menemukan bahwa ini bekerja paling baik untuk saya. Itu menimpa seperti yang diharapkan.
sumber
Untuk mereka yang mencari solusi ini di Bereaksi, Jika Anda ingin menggunakan operator dalam gaya, Anda harus menggunakan: babel-plugin-transform-objek-rest-spread.
Instal dengan modul npm dan konfigurasikan .brcrc Anda seperti itu:
Maka Anda dapat menggunakan seperti ...
Info lebih lanjut: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread/
sumber
Untuk mengambil yang ini lebih jauh, Anda bisa membuat fungsi pembantu seperti classnames :
Dan kemudian gunakan kondisional dalam komponen Anda:
sumber
Jadi pada dasarnya saya melihat ini dengan cara yang salah. Dari apa yang saya lihat, ini bukan pertanyaan spesifik Bereaksi, lebih merupakan pertanyaan JavaScript tentang bagaimana cara menggabungkan dua objek JavaScript bersama-sama (tanpa clobbering properti dengan nama yang sama).
Dalam jawaban StackOverflow ini menjelaskannya. Bagaimana saya bisa menggabungkan properti dua objek JavaScript secara dinamis?
Di jQuery saya bisa menggunakan metode extended.
sumber
Untuk Perluas apa yang dikatakan @PythonIsGreat, saya membuat fungsi global yang akan melakukannya untuk saya:
Ini sangat memperluas objek menjadi objek baru dan memungkinkan sejumlah variabel objek sebagai parameter. Ini memungkinkan Anda melakukan sesuatu seperti ini:
sumber
Saya telah membuat modul untuk ini jika Anda ingin menambahkan gaya berdasarkan kondisi seperti ini:
https://www.npmjs.com/package/react-native-multiple-styles
sumber
Cara penataan inline:
sumber