import React from 'react'; import ReactDOM from 'react-dom'; import { s8, createDiv, rectangle, createLayerDiv } from '@bici-topology/core'; // 存放原生dom节点 export const reactNodesData = {}; const drawReactNode = (ReactComponent) => (ctx, node) => { // 绘制一个底图,类似于占位符。 rectangle(ctx, node); // 如果未知组件,直接返回 if (!ReactComponent) { return; } // 需要设置一个唯一的id,方便绘画引擎识别 if (!node.elementId) { node.elementId = s8(); } // 节点的elementLoaded用于判断第三方图形库是否第一次加载,是否需要初始化 // 这是一个辅助变量,用户自己赋值使用或不用 if (!node.elementLoaded) { if(!document.getElementById(node.elementId)){ // 创建一个div容器 reactNodesData[node.id] = { div: createDiv(node) }; if(node.isEditable){ reactNodesData[node.id+"-layer"] = { div: createLayerDiv(node) }; document.body.appendChild(reactNodesData[node.id+"-layer"].div); } document.body.appendChild(reactNodesData[node.id].div); // 添加当前节点到div层,否则无法显示 node.addToDiv(); } // 初始化 react 组件 if(node && node.property) { reactNodesData[node.id].component = ReactDOM.render( , reactNodesData[node.id].div ); } } // 节点的elementRendered用于判断第三方图形库是否需要重绘 // 绘画引擎需要重绘节点时,会把此属性设置为false if (!node.elementRendered) { // 初始化时,等待父div先渲染完成,避免初始图表控件太大。 setTimeout(() => { // 重绘完成,避免不必要的重复重绘 node.elementRendered = true; }); } }; class ModalContainer extends React.Component { constructor(props) { super(props); } componentWillUnmount() { document.removeChild(this.props.el); } render() { return ReactDOM.createPortal( this.props.children, this.props.el ); } } export default drawReactNode;