|
1 |
| -import React from 'react'; |
| 1 | +import { createElement } from 'react'; |
2 | 2 | import dynamic from 'dva/dynamic';
|
3 | 3 | import { getMenuData } from './menu';
|
4 | 4 |
|
| 5 | +let routerDataCache; |
| 6 | + |
| 7 | +const modelNotExisted = (app, model) => ( |
| 8 | + // eslint-disable-next-line |
| 9 | + !app._models.some(({ namespace }) => namespace === model) |
| 10 | +); |
| 11 | + |
5 | 12 | // wrapper of dynamic
|
6 |
| -const dynamicWrapper = (app, models, component) => dynamic({ |
7 |
| - app, |
8 |
| - // eslint-disable-next-line no-underscore-dangle |
9 |
| - models: () => models.filter(m => !app._models.some(({ namespace }) => namespace === m)).map(m => import(`../models/${m}.js`)), |
10 |
| - // add routerData prop |
11 |
| - component: () => { |
12 |
| - const routerData = getRouterData(app); |
13 |
| - return component().then((raw) => { |
14 |
| - const Component = raw.default || raw; |
15 |
| - return props => <Component {...props} routerData={routerData} />; |
| 13 | +const dynamicWrapper = (app, models, component) => { |
| 14 | + // () => require('module') |
| 15 | + // transformed by babel-plugin-dynamic-import-node-sync |
| 16 | + if (component.toString().indexOf('.then(') < 0) { |
| 17 | + models.forEach((model) => { |
| 18 | + if (modelNotExisted(app, model)) { |
| 19 | + // eslint-disable-next-line |
| 20 | + app.model(require(`../models/${model}`).default); |
| 21 | + } |
16 | 22 | });
|
17 |
| - }, |
18 |
| -}); |
| 23 | + return (props) => { |
| 24 | + if (!routerDataCache) { |
| 25 | + routerDataCache = getRouterData(app); |
| 26 | + } |
| 27 | + return createElement(component().default, { |
| 28 | + ...props, |
| 29 | + routerData: routerDataCache, |
| 30 | + }); |
| 31 | + }; |
| 32 | + } |
| 33 | + // () => import('module') |
| 34 | + return dynamic({ |
| 35 | + app, |
| 36 | + models: () => models.filter( |
| 37 | + model => modelNotExisted(app, model)).map(m => import(`../models/${m}.js`) |
| 38 | + ), |
| 39 | + // add routerData prop |
| 40 | + component: () => { |
| 41 | + if (!routerDataCache) { |
| 42 | + routerDataCache = getRouterData(app); |
| 43 | + } |
| 44 | + return component().then((raw) => { |
| 45 | + const Component = raw.default || raw; |
| 46 | + return props => createElement(Component, { |
| 47 | + ...props, |
| 48 | + routerData: routerDataCache, |
| 49 | + }); |
| 50 | + }); |
| 51 | + }, |
| 52 | + }); |
| 53 | +}; |
19 | 54 |
|
20 | 55 | function getFlatMenuData(menus) {
|
21 | 56 | let keys = {};
|
|
0 commit comments