Должен быть контейнер, который отображает имена компонентов на все компоненты, которые должны использоваться динамически. Классы компонентов должны быть зарегистрированы в контейнере, потому что в модульной среде нет единого места, где они могли бы быть доступны. Классы компонентов не могут быть идентифицированы по их именам, не указав их явно, потому что функция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} />