import { createElement, ReactElement, ReactType } from 'react'; import LazyComponent from './lazyComponent'; export interface IAppData { App: any; config: object; } interface IComponentsMap { [key: string]: ReactType; } interface IUtilsMap { [key: string]: any; } type HistoryMode = 'browser' | 'hash'; export interface IAppConfig { history?: HistoryMode; globalComponents?: IComponentsMap; globalUtils?: IUtilsMap; containerId?: string; } export default abstract class Provider { public globalComponents: any = {}; public globalUtils: any = {}; public routerConfig: { [key: string]: string } = {}; public layout: { componentName: string; props: any } | null = null; private lazyElementsMap: { [key: string]: any } = {}; constructor() { this.init(); } public create(appkey: string): Promise { return new Promise(async (resolve, reject) => { try { const config = await this.getAppData(appkey); const App = this.createApp(); resolve({ App, config, }); } catch (err) { reject(err.message); } }); } public async init() { console.log('init'); } public async getAppData(appkey: string, restOptions?: any): Promise { console.log('getAppData'); return {}; } public async getPageData(pageId: string, restOptions?: any): Promise { console.log('getPageData'); return; } public getLazyComponent(pageId: string, props: any): ReactElement | null { if (!pageId) { return null; } if (this.lazyElementsMap[pageId]) { console.log('缓存'); return this.lazyElementsMap[pageId]; } else { const lazyElement = createElement(LazyComponent as any, { getPageData: async () => await this.getPageData(pageId), key: pageId, ...props, }); this.lazyElementsMap[pageId] = lazyElement; console.log('新组件'); return lazyElement; } } public createApp() { console.log('createApp'); return; } }