Es sollte einen Container geben, der Komponentennamen allen Komponenten zuordnet, die dynamisch verwendet werden sollen. Komponentenklassen sollten in einem Container registriert werden, da es in einer modularen Umgebung ansonsten keinen einzigen Ort gibt, an dem auf sie zugegriffen werden kann. Komponentenklassen können nicht anhand ihrer Namen identifiziert werden, ohne sie explizit anzugeben, da die Funktion name
in der Produktion minimiert wird.
Komponentenzuordnung
Es kann ein einfaches Objekt sein:
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
Oder Map
Instanz:
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);
Ein einfaches Objekt ist besser geeignet, da es von der Kurzform des Eigentums profitiert.
Laufmodul
Ein Fassmodul mit benannten Exporten kann als solche Karte fungieren:
// 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/>;
Dies funktioniert gut mit einer Klasse pro Modulcodestil.
Dekorateur
Dekorateure können mit Klassenkomponenten für syntaktischen Zucker verwendet werden. Dazu müssen die Klassennamen noch explizit angegeben und in einer Map registriert werden:
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'
...
}
Ein Dekorateur kann als Komponente höherer Ordnung mit Funktionskomponenten verwendet werden:
const Bar = props => ...;
Bar.displayName = 'Bar';
export default dynamic(Bar);
Die Verwendung von nicht standardmäßigendisplayName
Eigenschaften anstelle von zufälligen Eigenschaften kommt auch dem Debuggen zugute.
{...this.props}
nützlich finden , Requisiten transparent an untergeordnete Komponenten vom übergeordneten Element zu übergeben. Wiereturn <MyComponent {...this.props} />