Powinien istnieć kontener, który odwzorowuje nazwy komponentów na wszystkie komponenty, które mają być używane dynamicznie. Klasy komponentów powinny być zarejestrowane w kontenerze, ponieważ w środowisku modułowym nie ma innego miejsca, w którym można by uzyskać do nich dostęp. Klas komponentów nie można zidentyfikować za pomocą nazw bez ich jawnego określenia, ponieważ funkcja name
jest zminimalizowana w produkcji.
Mapa komponentów
Może to być zwykły przedmiot:
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
Lub na Map
przykład:
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);
Zwykły obiekt jest bardziej odpowiedni, ponieważ korzysta ze skrótu własności.
Moduł beczki
Moduł beczka z wymienionych eksportu może działać jako takiej mapie:
// 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/>;
Działa to dobrze z jedną klasą na styl kodu modułu.
Dekorator
Dekoratorów można używać z komponentami klas dla cukru składniowego, ale nadal wymaga to jawnego określenia nazw klas i zarejestrowania ich w mapie:
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 może być używany jako element wyższego rzędu z elementami funkcjonalnymi:
const Bar = props => ...;
Bar.displayName = 'Bar';
export default dynamic(Bar);
Użycie niestandardowejdisplayName
właściwości zamiast losowej również jest korzystne dla debugowania.
{...this.props}
przydatne do przezroczystego przekazywania rekwizytów do komponentów podrzędnych z rodzica. Na przykładreturn <MyComponent {...this.props} />