컴포넌트 이름을 동적으로 사용해야하는 모든 컴포넌트에 맵핑하는 컨테이너가 있어야합니다. 구성 요소 클래스는 컨테이너 환경에 등록해야합니다. 모듈 식 환경에서는 액세스 할 수있는 단일 위치가 없기 때문입니다. 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} />