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:
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
Atau Map
contoh:
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);
Objek polos lebih cocok karena diuntungkan oleh steno properti.
Modul barel
Sebuah modul barel dengan ekspor bernama dapat bertindak sebagai peta seperti:
// Foo.js
export class Foo extends React.Component { ... }
// dynamic-components.js
export * from './Foo';
export * from './Bar';
// some module that uses dynamic component
import * as componentsMap from './dynamic-components';
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
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:
const componentsMap = {};
function dynamic(Component) {
if (!Component.displayName)
throw new Error('no name');
componentsMap[Component.displayName] = Component;
return Component;
}
...
@dynamic
class Foo extends React.Component {
static displayName = 'Foo'
...
}
Dekorator dapat digunakan sebagai komponen tingkat tinggi dengan komponen fungsional:
const Bar = props => ...;
Bar.displayName = 'Bar';
export default dynamic(Bar);
Penggunaan non-standardisplayName
alih - alih properti acak juga menguntungkan debugging.
{...this.props}
manfaat untuk secara transparan meneruskan alat peraga ke komponen subtipe dari orang tua. Sepertireturn <MyComponent {...this.props} />