UNPKG

6.07 kBJavaScriptView Raw
1import React from 'react'
2import { AppLoader } from 'edf-app-loader'
3import componentFactory from './componentFactory'
4import omit from 'omit.js'
5import config from './config'
6import utils from 'edf-utils'
7
8function parseMetaProps(meta, props, data) {
9 const ret = {}
10
11 Object.keys(meta).forEach(key => {
12 let v = meta[key],
13 t = typeof v
14
15 if (v instanceof Array) {
16 ret[key] = []
17 v.forEach(c => {
18 let mc = metaToComponent(c, props, data)
19 if (mc instanceof Array)
20 ret[key] = ret[key].concat(mc)
21 else
22 ret[key].push(mc)
23 })
24 }
25 else if (t == 'object') {
26 if (v && v._notParse) {
27 ret[key] = v
28 }
29 else {
30 ret[key] = metaToComponent(v, props, data)
31 }
32 }
33 /*else if (t == 'function') {
34 ret[key] = v()
35 }*/
36 else {
37 ret[key] = v
38 }
39 })
40
41 return ret
42}
43
44function metaToComponent(meta, props, data) {
45 if (!meta)
46 return meta
47
48 const metaType = typeof meta
49
50 if (metaType == 'object' && meta['$$typeof']) {
51 return meta
52 }
53 else if (metaType == 'object' && meta['_isAMomentObject']) {
54 return meta
55 }
56 else if (metaType == 'object') {
57
58 if (meta.component) {
59 if (typeof meta.component == 'function') {
60 meta.component = meta.component()
61 }
62 if (meta['_visible'] === false)
63 return null
64
65 if (typeof meta['_visible'] === 'function' && meta['_visible']() === false)
66 return null
67
68 if (meta['_power'] && /for[ ]+in/.test(meta['_power'])) {
69 var p = meta['_power']
70 .replace(/for[ ]+in/, '')
71 .replace(' ', '')
72
73 if (p.indexOf('_rowIndex') != -1)
74 p = p.replace('_rowIndex', meta.path.split(',').length > 1 ? meta.path.split(',')[1].replace(' ', '') : 0)
75
76 let items = props.gf(p)
77
78 if (!items || items.size == 0) return
79 items = items.toJS()
80 return items.map((o, index) => {
81 let childMeta = props.gm(meta.path + ',' + index, undefined, data)
82 delete childMeta._power
83 return metaToComponent(childMeta, props, data)
84 })
85 }
86
87 if (meta['_power'] && meta['_power'].indexOf('=>') != -1) {
88 return (...args) => {
89 let varsString = ''
90
91 if (meta['_power'] == '({rowIndex})=>rowIndex') {
92 varsString = (new Function('return (function(_ref) {var rowIndex = _ref.rowIndex;return rowIndex})'))()(...args)
93 }
94 else {
95 varsString = (new Function('return ' + meta['_power']))()(...args)
96 }
97
98
99 /*
100 let browserType = utils.environment.getBrowserVersion()
101 if (browserType && (browserType.ie || browserType.chrome ==44)) {
102
103 }
104 else {
105 varsString = (new Function('return ' + meta['_power']))()(...args)
106 }*/
107
108
109 //let varsString = (new Function('return ' + meta['_power']))()(...args)
110 let childMeta = props.gm(meta.path + ',' + varsString, undefined, data)
111 delete childMeta._power
112 return metaToComponent(childMeta, props, data)
113 //return co ? React.cloneElement(co, { path: meta.path + ',' + varsString }) : co
114 }
115 }
116
117 const componentName = meta.component,
118 component = componentFactory.getComponent(props.appName, componentName)
119
120 var allProps = {
121 key: meta.path,
122 ...props,
123 ...parseMetaProps(meta, props, data),
124 }
125
126 //删除一些组件不需要的属性
127 delete allProps.clearAppState
128 delete allProps.component
129 delete allProps.name
130 delete allProps.getDirectFuns
131 delete allProps.initView
132 delete allProps.payload
133 delete allProps.componentWillMount
134 delete allProps.componentDidMount
135 delete allProps.shouldComponentUpdate
136 delete allProps.componentWillReceiveProps
137 delete allProps.componentWillUpdate
138 delete allProps.componentDidCatch
139 delete allProps.componentWillUnmount
140 delete allProps.componentDidUpdate
141 delete allProps.unmount
142
143 //使用omit性能较低
144 //allProps = omit(allProps, ['clearAppState', 'component', 'name', 'getDirectFuns', 'initView', 'payload'])
145
146 if (componentName == 'AppLoader') {
147 if (!allProps.appName)
148 return null
149 return React.createElement(component, { ...allProps, key: allProps.appName, name: allProps.appName })
150 }
151
152 delete allProps.store
153 delete allProps.appName
154 delete allProps.appFullName
155 delete allProps.appQuery
156 delete allProps.appParams
157 delete allProps.storeSubscription
158
159 return React.createElement(component, allProps)
160 }
161 else {
162 return parseMetaProps(meta, props, data)
163 }
164 }
165 else {
166 return meta
167 }
168}
169
170const MonkeyKing = (props) => {
171 const { path, gm, gf } = props
172 const data = gf().toJS()
173 return metaToComponent(gm(path, undefined, data), props, data)
174}
175
176export default MonkeyKing
\No newline at end of file