|
|
@@ -1,21 +1,56 @@
|
|
|
-import React from 'react';
|
|
|
+import { createElement } from 'react';
|
|
|
import dynamic from 'dva/dynamic';
|
|
|
import { getMenuData } from './menu';
|
|
|
|
|
|
+let routerDataCache;
|
|
|
+
|
|
|
+const modelNotExisted = (app, model) => (
|
|
|
+ // eslint-disable-next-line
|
|
|
+ !app._models.some(({ namespace }) => namespace === model)
|
|
|
+);
|
|
|
+
|
|
|
// wrapper of dynamic
|
|
|
-const dynamicWrapper = (app, models, component) => dynamic({
|
|
|
- app,
|
|
|
- // eslint-disable-next-line no-underscore-dangle
|
|
|
- models: () => models.filter(m => !app._models.some(({ namespace }) => namespace === m)).map(m => import(`../models/${m}.js`)),
|
|
|
- // add routerData prop
|
|
|
- component: () => {
|
|
|
- const routerData = getRouterData(app);
|
|
|
- return component().then((raw) => {
|
|
|
- const Component = raw.default || raw;
|
|
|
- return props => <Component {...props} routerData={routerData} />;
|
|
|
+const dynamicWrapper = (app, models, component) => {
|
|
|
+ // () => require('module')
|
|
|
+ // transformed by babel-plugin-dynamic-import-node-sync
|
|
|
+ if (component.toString().indexOf('.then(') < 0) {
|
|
|
+ models.forEach((model) => {
|
|
|
+ if (modelNotExisted(app, model)) {
|
|
|
+ // eslint-disable-next-line
|
|
|
+ app.model(require(`../models/${model}`).default);
|
|
|
+ }
|
|
|
});
|
|
|
- },
|
|
|
-});
|
|
|
+ return (props) => {
|
|
|
+ if (!routerDataCache) {
|
|
|
+ routerDataCache = getRouterData(app);
|
|
|
+ }
|
|
|
+ return createElement(component().default, {
|
|
|
+ ...props,
|
|
|
+ routerData: routerDataCache,
|
|
|
+ });
|
|
|
+ };
|
|
|
+ }
|
|
|
+ // () => import('module')
|
|
|
+ return dynamic({
|
|
|
+ app,
|
|
|
+ models: () => models.filter(
|
|
|
+ model => modelNotExisted(app, model)).map(m => import(`../models/${m}.js`)
|
|
|
+ ),
|
|
|
+ // add routerData prop
|
|
|
+ component: () => {
|
|
|
+ if (!routerDataCache) {
|
|
|
+ routerDataCache = getRouterData(app);
|
|
|
+ }
|
|
|
+ return component().then((raw) => {
|
|
|
+ const Component = raw.default || raw;
|
|
|
+ return props => createElement(Component, {
|
|
|
+ ...props,
|
|
|
+ routerData: routerDataCache,
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
function getFlatMenuData(menus) {
|
|
|
let keys = {};
|