react引入ggEditor流程图
遇到的问题
1.propsAPI获取不到内容:withPropsAPI包裹的组件必须是GGEditor的子组件。
2.自定义组件如何使用:正确的办法是通过config配置,参照上面的代码(之前我在在内部RegisterCommand以后,在onAfterExecuteCommand中截获命令,通过函数控制图例操作。这中间需要下钻到内部组件调用propsAPI,我就通过setState去设置状态传递到子组件。)
3.如何设置拖拽组件:太羞耻了,居然不晓得在Item双标签内放名称。
4.操作流程图后获取数据延迟:如果获取数据有延迟,尝试使用setTimeout,时间间隔设为0后再调propsAPI属性的方法操作。
1. 两种不同颜色的线
用onAfterChange监听,然后用先的更新设置不同的颜色即可。
2. 节点和线的更新
import React, { Fragment } from 'react';
import { Card, Form, Input, Select } from 'antd';
import { withPropsAPI } from 'gg-editor';
import upperFirst from 'lodash/upperFirst';
const { Item } = Form;
const { Option } = Select;
const inlineFormItemLayout = {
labelCol: {
sm: { span: 8 },
},
wrapperCol: {
sm: { span: 16 },
},
};
class DetailForm extends React.Component {
get item() {
const { propsAPI } = this.props;
return propsAPI.getSelected()[0];
}
handleSubmit = (e) => {
if (e && e.preventDefault) {
e.preventDefault();
}
const { form, propsAPI } = this.props;
const { getSelected, executeCommand, update } = propsAPI;
setTimeout(() => {
form.validateFieldsAndScroll((err, values) => {
if (err) {
return;
}
const item = getSelected()[0];
if (!item) {
return;
}
console.log(item,values,'values')
executeCommand(() => {
update(item, {
...values,
});
});
});
}, 0);
};
renderEdgeShapeSelect = () => {
return (
<Select onChange={this.handleSubmit}>
<Option value="flow-smooth">Smooth</Option>
<Option value="flow-polyline">Polyline</Option>
<Option value="flow-polyline-round">Polyline Round</Option>
</Select>
);
};
renderNodeDetail = () => {
const { form } = this.props;
const { label } = this.item.getModel();
return (
<Item label="Label" {...inlineFormItemLayout}>
{form.getFieldDecorator('label', {
initialValue: label.text ? label.text : label,
})(<Input onBlur={this.handleSubmit} />)}
</Item>
);
};
renderEdgeDetail = () => {
const { form } = this.props;
const { label = '', shape = 'flow-smooth' } = this.item.getModel();
return (
<Fragment>
<Item label="Label" {...inlineFormItemLayout}>
{form.getFieldDecorator('label', {
initialValue: label,
})(<Input onBlur={this.handleSubmit} />)}
</Item>
<Item label="Shape" {...inlineFormItemLayout}>
{form.getFieldDecorator('shape', {
initialValue: shape,
})(this.renderEdgeShapeSelect())}
</Item>
</Fragment>
);
};
renderGroupDetail = () => {
const { form } = this.props;
const { label = '新建分组' } = this.item.getModel();
return (
<Item label="Label" {...inlineFormItemLayout}>
{form.getFieldDecorator('label', {
initialValue: label,
})(<Input onBlur={this.handleSubmit} />)}
</Item>
);
};
render() {
const { type } = this.props;
if (!this.item) {
return null;
}
return (
<Card type="inner" size="small" title={upperFirst(type)} bordered={false}>
<Form onSubmit={this.handleSubmit}>
{type === 'node' && this.renderNodeDetail()}
{type === 'edge' && this.renderEdgeDetail()}
{type === 'group' && this.renderGroupDetail()}
</Form>
</Card>
);
}
}
export default Form.create()(withPropsAPI(DetailForm));
3. 提交数据
4. 自定义节点,注册节点
EditorCustomFlowMap组件
import React from 'react';
import { Col } from 'antd';
import { Flow } from 'gg-editor';
import { withPropsAPI } from 'gg-editor';
import CustomNode from '../EditorCustomNode'; const FlowMap = (props) => {return (
<Col span={21} className='editorContent'>
<Flow
className='flow'
data={props.data} // 已有节点那数据结构
noEndEdge={false}/>
<CustomNode />
</Col>
);
}; export default withPropsAPI(FlowMap);
CustomNode 组件,注册节点
import React from "react";
import { RegisterNode } from "gg-editor"; class CustomNode extends React.Component {
render() {
const config = {
draw(item) {
const keyShape = this.drawKeyShape(item); // 绘制图标
const group = item.getGraphicGroup();
const model = item.getModel(); group.addShape("image", {
attrs: {
x: -35,
y: -10,
width: 20,
height: 20,
img: model.icon
}
}); // 绘制标签
this.drawLabel(item); return keyShape;
}, anchor: [
[0.5, 0], // 上边中点
[1, 0.5], // 右边中点
[0.5, 1], // 底边中点
[0, 0.5] // 左边中点
]
}; return (
<RegisterNode name="custom-node" config={config} extend={"flow-circle"} />
);
}
} export default CustomNode;
5.已有节点的数据结构
{
"nodes": [
{
"id": "1",
"flowType":"flow-circle", // 节点使用的形状
"label":"开始",
"x": 100, // 节点X轴坐标位置
"y": 50,// 节点Y轴坐标位置
"color":"blue", // 节点的颜色
"size ": "80*48", // 节点的宽度和高度
"shape ": "flow-rect"
}
],
"edges": [
{
"source":"1",
"sourceAnchor": 1,
"target":"2",
"targetAnchor": 3,
"id": "d1",
"color":"red" // 连线的颜色
}
]
}
6.左侧待拖动的节点
这里的节点和flow图里面的节点样式控制不一样,这里的节点样式是靠css来控制。
flow图里面的节点样式,1,已有节点,靠的是已有节点的数据来控制,2,即将拖拽到flow区域的节点,是靠这里的Item属性来控制样式。
import React from 'react';
import { Card } from 'antd';
import { ItemPanel, Item } from 'gg-editor';
import './index.less';
const FlowItemPanel = () => {
return (
<ItemPanel className='itemPanel'>
<Card bordered={false}>
<Item
type="node"
size="72*72" shape="custom-node" // 自定义注册节点名称
model={{
icon:'//img.alicdn.com/tfs/TB1OzAmyyLaK1RjSZFxXXamPFXa-200-200.svg',
color: '#FA8C16',
label:{
text:'流程',
fill: 'green'
},
}}
>
<div className="flow-node">流程</div>
</Item> <Item
type="node"
size="80*48" shape="flow-rect"
model={{
color: '#1890FF',
label:{
text:'文档',
fill: '#000'
},
}}
>
<div className="document-node">文档</div>
</Item>
</Card>
</ItemPanel>
);
}; export default FlowItemPanel;
.flow-node{
border: 1px solid #fed49a;
background-color: #fef6e7;
border-radius: 50%;
padding: 20px;
color: green;
-webkit-user-select: none;
-ms-user-select: none; /* Internet Explorer/Edge */
}
.document-node{
border-radius: 10%;
border: 1px solid #a7dafe;
background-color: #e7f6fe;
padding: 15px 20px;
-webkit-user-select: none;
-ms-user-select: none; /* Internet Explorer/Edge */
}
7.操作栏的设置
import React from 'react';
import { Divider } from 'antd';
import { Toolbar } from 'gg-editor';
import ToolbarButton from './ToolbarButton';
import './index.less'; const FlowToolbar = () => {
return (
<Toolbar className='toolbar'>
<ToolbarButton command="undo" text="回退一步" />
<ToolbarButton command="redo" text="前进一步" />
<Divider type="vertical" />
<ToolbarButton command="copy" text="复制" />
<ToolbarButton command="paste" text="粘贴" />
<ToolbarButton command="delete" text="删除" />
<Divider type="vertical" />
<ToolbarButton command="zoomIn" icon="zoom-in" text="Zoom In" />
<ToolbarButton command="zoomOut" icon="zoom-out" text="Zoom Out" />
<ToolbarButton command="autoZoom" icon="fit-map" text="Fit Map" />
<ToolbarButton command="resetZoom" icon="actual-size" text="Actual Size" />
<Divider type="vertical" />
<ToolbarButton command="toBack" icon="to-back" text="To Back" />
<ToolbarButton command="toFront" icon="to-front" text="To Front" />
<Divider type="vertical" />
<ToolbarButton command="multiSelect" icon="multi-select" text="Multi Select" />
<ToolbarButton command="addGroup" icon="group" text="Add Group" />
<ToolbarButton command="unGroup" icon="ungroup" text="Ungroup" />
</Toolbar>
);
}; export default FlowToolbar;
8. 总
import React from 'react';
import { Row, Col } from 'antd';
import GGEditor from 'gg-editor';
import EditorMinimap from '../components/EditorMinimap';
import { FlowContextMenu } from '../components/EditorContextMenu';
import { FlowToolbar } from '../components/EditorToolbar';
import { FlowItemPanel } from '../components/EditorItemPanel';
import { FlowDetailPanel } from '../components/EditorDetailPanel';
import './index.less';
import EditorCustomDetailPanel from '../components/EditorCustomDetailPanel';
import EditorCustomFlowMap from '../components/EditorCustomFlowMap';
const flowData = {nodes:[],edges:[]}; const FlowPage = (props) => {return (
<GGEditor className='editor' style={{height:props.height}}>
<Row type="flex" className='editorHd'>
<Col span={24}>
<FlowToolbar />
</Col>
</Row>
<Row type="flex" className='editorBd'>
<Col span={3} className='editorSidebar'>
<FlowItemPanel />
</Col>
<EditorCustomFlowMap
data={flowData}
onNodeClick={props.handleNodeClick}
onNodeDragEnd ={props.handleNodeDragEnd}
handleAfterChange={props.handleAfterChange}
/>
<Col span={4} className='editorSidebar'>
<FlowDetailPanel />
<EditorMinimap />
</Col></Row>
<FlowContextMenu />
<EditorCustomDetailPanel
visibleDetailPanel={props.visibleDetailPanel}
hideVisibleDetailPanel={props.hideVisibleDetailPanel}
detailPanel={props.detailPanel}
currentNode={props.currentNode}
changeDetailPanel={props.changeDetailPanel}
submitCurrentNode={props.submitCurrentNode}
/>
</GGEditor>
);
}; export default FlowPage;
react引入ggEditor流程图的更多相关文章
- 在 React 项目中引入 GG-Editor 编辑可视化流程
蚂蚁金服数据可视化团队曾经开源了一款G6-Editor,但后来停止了对外支持,学习成本太高 好在后来他们团队的大牛高力结合 React + G6 开源了一个 GG-Editor(其实就是G6-Edit ...
- 10分钟了解 react 引入的 Hooks
"大家好,我是谷阿莫,今天要将的是一个...",哈哈哈,看到这个题我就想到这个开头.最近react 官方在 2018 ReactConf 大会上宣布 React v16.7.0-a ...
- React引入,运行
1.引入 <script src="https://cdn.bootcss.com/react/15.5.4/react.min.js"></script> ...
- react 引入 百度地图API
使用 Echarts 的地图的时候,发现报错,说 Bmap api is not loaded 百度地图API没有加载 乍一想,Echarts 用的也是 百度地图 啊,没有引入百度地图,还用个啥,当然 ...
- React 引入import React 原理
本质上来说JSX是React.createElement(component, props, ...children)方法的语法糖. 所以我们如果使用了JSX,我们其实就是在使用React,所以我们就 ...
- Hexo引入Mermaid流程图和MathJax数学公式
近来用Markdown写文章,越来越不喜欢插入图片了,一切能用语法解决的问题坚决不放图,原因有二: 如果把流程图和数学公式都以图片方式放到文章内,当部署到Github上后,访问博客时图片加载实在太慢, ...
- react引入图片不显示问题
在react 中引入图片的方式和正常不同,,很容易引入不显示 引入本地图片 1.(采用组件式引入方法) import Logo from "图片路径" <img src={L ...
- react引入方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- React引入AntD按需加载报错
背景:React使用create-react-app脚手架创建,然后yarn run eject暴露了配置之后修改less配置, 需求:实现antd组件按需加载与修改主题. 一开始是按照webpack ...
随机推荐
- windows 安装mongodb2
安装文件:mongodb-win32-x86_64-2008plus-ssl-3.2.6-signed.msi 电脑配置:win7 64位 MongoDB的安装很简单,设置好安装路径后,一直Next直 ...
- Vue中的计算属性
一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护. 二.计算属性的用法 在一个计算属性里可以完成各种复杂的逻辑,包括运算.函 ...
- sharding-JDBC学习笔记
sharding-JDBC学习笔记 ShardingSphere ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Pr ...
- 初识Redis,看这一篇就够了
环境的搭建和安装网上有很多教程,在这里就不再重复了. 1. Redis是什么? Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写. ...
- ROS机器人之话题(一)
将消息发布到话题上 首先建立一个basic包(名称自己定)其命令为: 1.创建功能包,应用catkin_create_pkg命令 cd ~/catkin_ws/src #切换到代码空间,也 ...
- 自学Java第三章——《流程控制语句结构》
流程控制语句结构分为: 1.顺序结构:从上到下依次执行 2.分支结构:多个分支选择其中一个分支执行 3.循环结构:重复执行某些代码 3.1 顺序结构 执行过程:从上到下顺序执行 3.1.1 输出语句 ...
- WTL Hello World
构建最简单的WTL Hello World程序,基于:WTL91_5321_Final + VS2013 + WIN7 添加->新建项目 为了简单起见,我们删除一些button和对应的处理代码( ...
- CCF_ 201409-2_画图
将一个数组比作画板,有颜色的位置标1,统计即可. #include<cstdio> #include<iostream> #define NUM 100 using names ...
- CBAM(Convolutional Block Attention Module)使用指南
转自知乎 这货就是基于 SE-Net [5]中的 Squeeze-and-Excitation module 来进行进一步拓展 具体来说,文中把 channel-wise attention 看成是教 ...
- RocketMQ重试机制和消息幂等
一.重试机制 由于MQ经常处于复杂的分布式系统中,考虑网络波动,服务宕机,程序异常因素,很有可能出现消息发送或者消费失败的问题.因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点.如果没有消息重 ...