Saya mencoba membuat komponen secara dinamis berdasarkan jenisnya.
Sebagai contoh:
var type = "Example";
var ComponentName = type + "Component";
return <ComponentName />;
// Returns <examplecomponent /> instead of <ExampleComponent />
Saya mencoba solusi yang diusulkan di sini Bereaksi / JSX nama komponen dinamis
Itu memberi saya kesalahan saat kompilasi (menggunakan browserify untuk tegukan). Diharapkan XML tempat saya menggunakan sintaks array.
Saya bisa menyelesaikan ini dengan membuat metode untuk setiap komponen:
newExampleComponent() {
return <ExampleComponent />;
}
newComponent(type) {
return this["new" + type + "Component"]();
}
Tetapi itu berarti metode baru untuk setiap komponen yang saya buat. Harus ada solusi yang lebih elegan untuk masalah ini.
Saya sangat terbuka untuk saran.
{...this.props}
manfaat untuk secara transparan meneruskan alat peraga ke komponen subtipe dari orang tua. Sepertireturn <MyComponent {...this.props} />
Ada dokumentasi resmi tentang cara menangani situasi seperti ini tersedia di sini: https://facebook.github.io/react/docs/jsx-in-depth.html#choosing-the-type-at-runtime
Pada dasarnya dikatakan:
Salah:
Benar:
sumber
Seharusnya ada wadah yang memetakan nama komponen ke semua komponen yang seharusnya digunakan secara dinamis. Kelas komponen harus didaftarkan dalam wadah karena dalam lingkungan modular tidak ada tempat di mana mereka dapat diakses. Kelas komponen tidak dapat diidentifikasi dengan namanya tanpa menentukannya secara eksplisit karena fungsinya
name
diperkecil dalam produksi.Peta komponen
Ini bisa berupa objek biasa:
Atau
Map
contoh:Objek polos lebih cocok karena diuntungkan oleh steno properti.
Modul barel
Sebuah modul barel dengan ekspor bernama dapat bertindak sebagai peta seperti:
Ini berfungsi baik dengan satu kelas per gaya kode modul.
Penghias
Dekorator dapat digunakan dengan komponen kelas untuk gula sintaksis, ini masih membutuhkan untuk menentukan nama kelas secara eksplisit dan mendaftarkannya di peta:
Dekorator dapat digunakan sebagai komponen tingkat tinggi dengan komponen fungsional:
Penggunaan non-standar
displayName
alih - alih properti acak juga menguntungkan debugging.sumber
Saya menemukan solusi baru. Perhatikan bahwa saya menggunakan modul ES6 jadi saya membutuhkan kelas. Anda juga bisa mendefinisikan kelas Bereaksi baru sebagai gantinya.
sumber
default
atribut? yaitu: membutuhkan ('./ ExampleComponent'). default?Jika komponen Anda bersifat global, Anda dapat melakukannya:
sumber
Components
array tidak ditentukan.Untuk komponen pembungkus, solusi sederhana adalah dengan menggunakan
React.createElement
langsung (menggunakan ES6).sumber
Di semua opsi dengan peta komponen, saya belum menemukan cara paling sederhana untuk mendefinisikan peta menggunakan sintaks pendek ES6:
sumber
Memiliki peta sama sekali tidak terlihat bagus dengan sejumlah besar komponen. Saya sebenarnya terkejut bahwa tidak ada yang menyarankan sesuatu seperti ini:
Yang ini benar-benar membantu saya ketika saya perlu membuat sejumlah besar komponen yang dimuat dalam bentuk json array.
sumber
React.createElement(MyComponent)
langsung melemparkan kesalahan. Secara khusus, saya tidak ingin orang tua harus mengetahui semua komponen untuk diimpor (dalam pemetaan) - karena itu sepertinya langkah tambahan. Sebaliknya, saya menggunakanconst MyComponent = require("path/to/component/" + "ComponentNameString").default; return <MyComponent />
.Anggap kita ingin mengakses berbagai tampilan dengan pemuatan komponen dinamis. Kode berikut memberikan contoh yang bisa digunakan tentang bagaimana melakukannya dengan menggunakan string yang diuraikan dari string pencarian dari url.
Mari kita asumsikan kita ingin mengakses halaman 'snozberry' dengan dua tampilan unik menggunakan jalur url ini:
dan
kami mendefinisikan pengontrol tampilan kami seperti ini:
sumber
Asumsikan kita memiliki
flag
, tidak berbeda denganstate
atauprops
:Dengan flag,
Compo
isi dengan salah satuComponentOne
atauComponentTwo
kemudianCompo
dapat bertindak seperti Komponen Bereaksi.sumber
Saya menggunakan Pendekatan yang sedikit berbeda, karena kami selalu tahu komponen kami yang sebenarnya jadi saya pikir untuk menerapkan saklar kasus. Juga total tidak ada komponen sekitar 7-8 dalam kasus saya.
sumber
Sunting: Jawaban lain lebih baik, lihat komentar.
Saya memecahkan masalah yang sama dengan cara ini:
sumber
React.createElement
akan dipanggil untuk setiap komponen dalam objek pencarian Anda, meskipun hanya satu dari mereka yang ditampilkan pada satu waktu. Lebih buruk lagi, dengan menempatkan objek pencarian dalamrender
metode komponen induk, ia akan melakukannya lagi setiap kali induk diberikan. Jawaban teratas adalah cara yang jauh lebih baik untuk mencapai hal yang sama.