1- import React from 'react' ;
1+ import { createElement } from 'react' ;
22import dynamic from 'dva/dynamic' ;
33import { getMenuData } from './menu' ;
44
5+ let routerDataCache ;
6+
7+ const modelNotExisted = ( app , model ) => (
8+ // eslint-disable-next-line
9+ ! app . _models . some ( ( { namespace } ) => {
10+ return namespace === model . substring ( model . lastIndexOf ( '/' ) + 1 ) ;
11+ } )
12+ ) ;
13+
514// 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 } /> ;
15+ const dynamicWrapper = ( app , models , component ) => {
16+ // () => require('module')
17+ // transformed by babel-plugin-dynamic-import-node-sync
18+ if ( component . toString ( ) . indexOf ( '.then(' ) < 0 ) {
19+ models . forEach ( ( model ) => {
20+ if ( modelNotExisted ( app , model ) ) {
21+ // eslint-disable-next-line
22+ app . model ( require ( `../models/${ model } ` ) . default ) ;
23+ }
1624 } ) ;
17- } ,
18- } ) ;
25+ return ( props ) => {
26+ if ( ! routerDataCache ) {
27+ routerDataCache = getRouterData ( app ) ;
28+ }
29+ return createElement ( component ( ) . default , {
30+ ...props ,
31+ routerData : routerDataCache ,
32+ } ) ;
33+ } ;
34+ }
35+ // () => import('module')
36+ return dynamic ( {
37+ app,
38+ models : ( ) => models . filter (
39+ model => modelNotExisted ( app , model ) ) . map ( m => import ( `../models/${ m } .js` )
40+ ) ,
41+ // add routerData prop
42+ component : ( ) => {
43+ if ( ! routerDataCache ) {
44+ routerDataCache = getRouterData ( app ) ;
45+ }
46+ return component ( ) . then ( ( raw ) => {
47+ const Component = raw . default || raw ;
48+ return props => createElement ( Component , {
49+ ...props ,
50+ routerData : routerDataCache ,
51+ } ) ;
52+ } ) ;
53+ } ,
54+ } ) ;
55+ } ;
1956
2057function getFlatMenuData ( menus ) {
2158 let keys = { } ;
2259 menus . forEach ( ( item ) => {
2360 if ( item . children ) {
24- keys [ item . path ] = item . name ;
61+ keys [ item . path ] = { ... item } ;
2562 keys = { ...keys , ...getFlatMenuData ( item . children ) } ;
2663 } else {
27- keys [ item . path ] = item . name ;
64+ keys [ item . path ] = { ... item } ;
2865 }
2966 } ) ;
3067 return keys ;
3168}
3269
3370export const getRouterData = ( app ) => {
34- const routerData = {
71+ const routerConfig = {
3572 '/' : {
3673 component : dynamicWrapper ( app , [ 'user' , 'login' ] , ( ) => import ( '../layouts/BasicLayout' ) ) ,
3774 } ,
@@ -45,6 +82,7 @@ export const getRouterData = (app) => {
4582 component : dynamicWrapper ( app , [ 'project' , 'activities' , 'chart' ] , ( ) => import ( '../routes/Dashboard/Workplace' ) ) ,
4683 // hideInBreadcrumb: true,
4784 // name: '工作台',
85+ // authority: 'admin',
4886 } ,
4987 '/form/basic-form' : {
5088 component : dynamicWrapper ( app , [ 'form' ] , ( ) => import ( '../routes/Forms/BasicForm' ) ) ,
@@ -127,12 +165,14 @@ export const getRouterData = (app) => {
127165 } ;
128166 // Get name from ./menu.js or just set it in the router data.
129167 const menuData = getFlatMenuData ( getMenuData ( ) ) ;
130- const routerDataWithName = { } ;
131- Object . keys ( routerData ) . forEach ( ( item ) => {
132- routerDataWithName [ item ] = {
133- ...routerData [ item ] ,
134- name : routerData [ item ] . name || menuData [ item . replace ( / ^ \/ / , '' ) ] ,
168+ const routerData = { } ;
169+ Object . keys ( routerConfig ) . forEach ( ( item ) => {
170+ const menuItem = menuData [ item . replace ( / ^ \/ / , '' ) ] || { } ;
171+ routerData [ item ] = {
172+ ...routerConfig [ item ] ,
173+ name : routerConfig [ item ] . name || menuItem . name ,
174+ authority : routerConfig [ item ] . authority || menuItem . authority ,
135175 } ;
136176 } ) ;
137- return routerDataWithName ;
177+ return routerData ;
138178} ;
0 commit comments