Cần có một thùng chứa ánh xạ tên thành phần cho tất cả các thành phần được cho là được sử dụng động. Các lớp thành phần nên được đăng ký trong một thùng chứa bởi vì trong môi trường mô đun, nếu không thì không thể truy cập một nơi duy nhất. Các lớp thành phần không thể được xác định bằng tên của chúng mà không chỉ định rõ ràng vì hàm name
được thu nhỏ trong sản xuất.
Bản đồ thành phần
Nó có thể là đối tượng đơn giản:
class Foo extends React.Component { ... }
...
const componentsMap = { Foo, Bar };
...
const componentName = 'Fo' + 'o';
const DynamicComponent = componentsMap[componentName];
<DynamicComponent/>;
Hoặc Map
ví dụ:
const componentsMap = new Map([[Foo, Foo], [Bar, Bar]]);
...
const DynamicComponent = componentsMap.get(componentName);
Đối tượng đơn giản là phù hợp hơn vì nó được hưởng lợi từ tốc ký tài sản.
Mô-đun thùng
Một mô-đun thùng với xuất khẩu được đặt tên có thể hoạt động như bản đồ:
// 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/>;
Điều này hoạt động tốt với một lớp cho mỗi kiểu mã mô-đun.
Người trang trí
Trình trang trí có thể được sử dụng với các thành phần lớp cho đường cú pháp, điều này vẫn yêu cầu xác định rõ ràng tên lớp và đăng ký chúng trong bản đồ:
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'
...
}
Một bộ trang trí có thể được sử dụng như một thành phần bậc cao hơn với các thành phần chức năng:
const Bar = props => ...;
Bar.displayName = 'Bar';
export default dynamic(Bar);
Việc sử dụng phi tiêu chuẩndisplayName
thay vì thuộc tính ngẫu nhiên cũng có lợi cho việc gỡ lỗi.
{...this.props}
hữu ích để chuyển các đạo cụ trong suốt sang các thành phần được phân nhóm từ cha mẹ. Giống nhưreturn <MyComponent {...this.props} />