Bileşen adlarını, dinamik olarak kullanılması gereken tüm bileşenlerle eşleyen bir kap olmalıdır. Bileşen sınıfları bir kapta kaydedilmelidir, çünkü modüler ortamda erişilebilecekleri tek bir yer yoktur. Bileşen sınıfları, işlev name
üretimde küçültüldüğünden, açıkça belirtilmeden adlarıyla tanımlanamaz .
Bileşen haritası
Düz nesne olabilir:
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
Veya Map
örnek:
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);
Düz obje daha uygundur çünkü mülkten steno faydalanır.
Namlu modülü
Belirtilen ihracatlara sahip bir varil modülü bu harita gibi davranabilir:
// 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/>;
Bu, modül kodu stili başına bir sınıfla iyi çalışır.
Dekoratör
Dekoratörler, sözdizimsel şeker için sınıf bileşenleriyle birlikte kullanılabilir, bunun için yine de sınıf adlarının açıkça belirtilmesi ve bir haritaya kaydedilmesi gerekir:
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'
...
}
Bir dekoratör, işlevsel bileşenlere sahip daha üst düzey bileşen olarak kullanılabilir:
const Bar = props => ...;
Bar.displayName = 'Bar';
export default dynamic(Bar);
Rasgele özellik yerine standart dışıdisplayName
kullanılması da hata ayıklamaya yarar.
{...this.props}
sahne malzemelerini alt öğelerin bileşenlerinden şeffaf bir şekilde geçirmeleri için muhtemelen yararlı bulacaktır . Likereturn <MyComponent {...this.props} />