feat: 增加loading扩展点

This commit is contained in:
wuyue.xht 2020-03-17 00:35:37 +08:00
parent e48307dc6d
commit 3a1e900149
3 changed files with 58 additions and 36 deletions

View File

@ -0,0 +1,44 @@
import { ComponentClass, FunctionComponent } from 'react';
type TComponent = ComponentClass | FunctionComponent;
class Trunk {
private renderer: TComponent | null = null;
private layouts: { [key: string]: TComponent } = {};
private loading: TComponent | null = null;
public registerRenderer(renderer: TComponent): any {
this.renderer = renderer;
}
public registerLayout(componentName: string, Layout: TComponent): any {
if (!componentName || !Layout) {
return;
}
this.layouts[componentName] = Layout;
}
public registerLoading(component: TComponent) {
if (!component) {
return;
}
this.loading = component;
}
public getLayout(componentName: string) {
if (!componentName) {
return;
}
return this.layouts[componentName];
}
public getRenderer(): TComponent | null {
return this.renderer;
}
public getLoading(): TComponent | null {
return this.loading;
}
}
export default new Trunk();

View File

@ -1,5 +1,5 @@
import { Component, createElement } from 'react';
import Trunk from './trunk';
import Boot from './boot';
interface IProps {
getPageData: () => any;
@ -11,6 +11,8 @@ interface IState {
}
export default class LazyComponent extends Component<IProps, IState> {
private schema: object | null = null;
constructor(props: IProps) {
super(props);
this.state = {
@ -20,19 +22,25 @@ export default class LazyComponent extends Component<IProps, IState> {
public async componentDidMount() {
const { getPageData } = this.props;
if (getPageData) {
if (getPageData && !this.schema) {
const schema = await getPageData();
this.schema = schema;
this.setState({ schema });
}
}
public render() {
const Renderer = Trunk.getRenderer();
if (!Renderer) {
return null;
}
const { getPageData, ...restProps } = this.props;
const { schema } = this.state;
const Renderer = Boot.getRenderer();
const Loading = Boot.getLoading();
if (!Renderer || !schema) {
if (!Loading) {
return null;
}
// loading扩展点
return createElement(Loading);
}
return createElement(Renderer as any, { schema, ...restProps });
}
}

View File

@ -1,30 +0,0 @@
import { ComponentClass } from 'react';
class Trunk {
private renderer: ComponentClass | null = null;
private layouts: { [key: string]: ComponentClass } = {};
public registerRenderer(renderer: ComponentClass): any {
this.renderer = renderer;
}
public registerLayout(componentName: string, Layout: ComponentClass): any {
if (!componentName || !Layout) {
return;
}
this.layouts[componentName] = Layout;
}
public getLayout(componentName: string) {
if (!componentName) {
return;
}
return this.layouts[componentName];
}
public getRenderer(): ComponentClass | null {
return this.renderer;
}
}
export default new Trunk();