import { I_Node } from '@fangzhou/compiler-js'; import React, { FC } from 'react'; import { View, StyleSheet } from 'react-native'; import { useObservable, useComponent } from '@fangzhou/rxui-lite'; import css from './style'; export function RenderCom({ node, comDefs, env, slotIo, rtMaps, events, layoutComs, }: { node: {} & I_Node; comDefs; env; slotIo: any; rtMaps: {}; events: any; layoutComs: { Wrapper: FC; Slot: FC; }; }) { const { slots: comSlots, parent, def, id, model, title } = node; const rtType = def.rtType; if (rtType && rtType.match(/js/gi)) { //逻辑组件 return; } const nodeModel = model; const style = useObservable(nodeModel.style); const data = useObservable(nodeModel.data); const comDefsKey = def.namespace + '@' + def.version; const ComRuntime = comDefs[comDefsKey]; const rt = rtMaps[id]; const { inputs, outputs, fork } = rt.io; let nInputs = inputs, nOutputs = outputs; // 当slot有io时,rt.io里merge slotIo的输入输出,参考designer的debugrunner里render代码 if (inputs && slotIo?.inputs) { nInputs = fork('inputs', slotIo.inputs); } if (outputs && slotIo?.outputs) { nOutputs = fork('outputs', slotIo.outputs); } const slots = {}; const Slot = layoutComs.Slot; const Wrapper = layoutComs.Wrapper; if (comSlots) { comSlots.forEach((slot) => { slots[slot.id] = { id: slot.id, title: slot.title, //comAry:slot.comAry, render(...args) { const { frames } = rtMaps[id]; let frame; for (let fid in frames) { frame = frames[fid]; delete frames[fid]; } if (frame && args[1]) { frame(void 0, node.id); } const fn = frames[slot.id]; if (typeof fn === 'function') { fn(); //兼容之前的非框图 } const comAry = slot.comAry || []; return ( {comAry.map((com) => { return ( ); })} ); }, get size() { return slot.comAry?.length || 0; }, }; }); } const Render = useComponent(() => { return ( ); }); return ; }