Повинен бути контейнер, який відображає назви компонентів для всіх компонентів, які повинні використовуватись динамічно. Класи компонентів повинні бути зареєстровані в контейнері, оскільки в модульному середовищі інакше немає єдиного місця, де можна було б отримати доступ до них. Класи компонентів не можуть бути ідентифіковані за їх іменами, не вказуючи їх чітко, оскільки функція name
у виробництві спрощена.
Карта компонентів
Це може бути звичайний об'єкт:
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
Або, Map
наприклад:
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);
Звичайний об’єкт є більш підходящим, оскільки він отримує вигоду від скорочення власності.
Модуль ствола
Модуль барила з іменованих експортом може виступати в якості такої карти:
// 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/>;
Це добре працює з одним класом у стилі коду модуля.
Декоратор
Декоратори можна використовувати з компонентами класу для синтаксичного цукру, для цього все одно потрібно чітко вказати назви класів та зареєструвати їх на карті:
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'
...
}
Декоратор може бути використаний як компонент вищого порядку з функціональними компонентами:
const Bar = props => ...;
Bar.displayName = 'Bar';
export default dynamic(Bar);
Використання нестандартноїdisplayName
замість випадкової властивості також виграє налагодження.
{...this.props}
корисно прозоро передавати реквізити до підтипових компонентів від батьківських. Якreturn <MyComponent {...this.props} />