ควรมีคอนเทนเนอร์ที่แม็พชื่อคอมโพเนนต์กับคอมโพเนนต์ทั้งหมดที่ควรถูกใช้แบบไดนามิก คลาสคอมโพเนนต์ควรลงทะเบียนในคอนเทนเนอร์เนื่องจากในสภาพแวดล้อมแบบโมดูลาร์ไม่มีสถานที่เดียวที่สามารถเข้าถึงได้ ไม่สามารถระบุคลาสคอมโพเนนต์โดยชื่อโดยไม่ระบุอย่างชัดเจนเนื่องจากฟังก์ชัน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);
วัตถุธรรมดามีความเหมาะสมมากกว่าเพราะได้รับประโยชน์จากการจดชวเลข
โมดูล Barrel
โมดูลบาร์เรลกับการส่งออกชื่อสามารถทำหน้าที่เป็นแผนที่ดังกล่าว
// 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/>;
ใช้งานได้ดีกับหนึ่งคลาสต่อสไตล์โค้ดของโมดูล
มัณฑนากร
มัณฑนากรสามารถใช้กับส่วนประกอบของคลาสสำหรับน้ำตาล syntactic นี้ยังคงต้องระบุชื่อคลาสอย่างชัดเจนและลงทะเบียนในแผนที่:
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} />