ttk-server-parent
Version:
176 lines (147 loc) • 6.07 kB
JavaScript
import React from 'react'
import { AppLoader } from 'edf-app-loader'
import componentFactory from './componentFactory'
import omit from 'omit.js'
import config from './config'
import utils from 'edf-utils'
function parseMetaProps(meta, props, data) {
const ret = {}
Object.keys(meta).forEach(key => {
let v = meta[key],
t = typeof v
if (v instanceof Array) {
ret[key] = []
v.forEach(c => {
let mc = metaToComponent(c, props, data)
if (mc instanceof Array)
ret[key] = ret[key].concat(mc)
else
ret[key].push(mc)
})
}
else if (t == 'object') {
if (v && v._notParse) {
ret[key] = v
}
else {
ret[key] = metaToComponent(v, props, data)
}
}
/*else if (t == 'function') {
ret[key] = v()
}*/
else {
ret[key] = v
}
})
return ret
}
function metaToComponent(meta, props, data) {
if (!meta)
return meta
const metaType = typeof meta
if (metaType == 'object' && meta['$$typeof']) {
return meta
}
else if (metaType == 'object' && meta['_isAMomentObject']) {
return meta
}
else if (metaType == 'object') {
if (meta.component) {
if (typeof meta.component == 'function') {
meta.component = meta.component()
}
if (meta['_visible'] === false)
return null
if (typeof meta['_visible'] === 'function' && meta['_visible']() === false)
return null
if (meta['_power'] && /for[ ]+in/.test(meta['_power'])) {
var p = meta['_power']
.replace(/for[ ]+in/, '')
.replace(' ', '')
if (p.indexOf('_rowIndex') != -1)
p = p.replace('_rowIndex', meta.path.split(',').length > 1 ? meta.path.split(',')[1].replace(' ', '') : 0)
let items = props.gf(p)
if (!items || items.size == 0) return
items = items.toJS()
return items.map((o, index) => {
let childMeta = props.gm(meta.path + ',' + index, undefined, data)
delete childMeta._power
return metaToComponent(childMeta, props, data)
})
}
if (meta['_power'] && meta['_power'].indexOf('=>') != -1) {
return (...args) => {
let varsString = ''
if (meta['_power'] == '({rowIndex})=>rowIndex') {
varsString = (new Function('return (function(_ref) {var rowIndex = _ref.rowIndex;return rowIndex})'))()(...args)
}
else {
varsString = (new Function('return ' + meta['_power']))()(...args)
}
/*
let browserType = utils.environment.getBrowserVersion()
if (browserType && (browserType.ie || browserType.chrome ==44)) {
}
else {
varsString = (new Function('return ' + meta['_power']))()(...args)
}*/
//let varsString = (new Function('return ' + meta['_power']))()(...args)
let childMeta = props.gm(meta.path + ',' + varsString, undefined, data)
delete childMeta._power
return metaToComponent(childMeta, props, data)
//return co ? React.cloneElement(co, { path: meta.path + ',' + varsString }) : co
}
}
const componentName = meta.component,
component = componentFactory.getComponent(props.appName, componentName)
var allProps = {
key: meta.path,
...props,
...parseMetaProps(meta, props, data),
}
//删除一些组件不需要的属性
delete allProps.clearAppState
delete allProps.component
delete allProps.name
delete allProps.getDirectFuns
delete allProps.initView
delete allProps.payload
delete allProps.componentWillMount
delete allProps.componentDidMount
delete allProps.shouldComponentUpdate
delete allProps.componentWillReceiveProps
delete allProps.componentWillUpdate
delete allProps.componentDidCatch
delete allProps.componentWillUnmount
delete allProps.componentDidUpdate
delete allProps.unmount
//使用omit性能较低
//allProps = omit(allProps, ['clearAppState', 'component', 'name', 'getDirectFuns', 'initView', 'payload'])
if (componentName == 'AppLoader') {
if (!allProps.appName)
return null
return React.createElement(component, { ...allProps, key: allProps.appName, name: allProps.appName })
}
delete allProps.store
delete allProps.appName
delete allProps.appFullName
delete allProps.appQuery
delete allProps.appParams
delete allProps.storeSubscription
return React.createElement(component, allProps)
}
else {
return parseMetaProps(meta, props, data)
}
}
else {
return meta
}
}
const MonkeyKing = (props) => {
const { path, gm, gf } = props
const data = gf().toJS()
return metaToComponent(gm(path, undefined, data), props, data)
}
export default MonkeyKing