LogicFlow自定义业务节点

news/2024/11/14 22:45:03/

🎄Hi~ 大家好,我是小鑫同学,一位长期从事前端开发的编程爱好者,我将使用更为实用的案例输出更多的编程知识,同时我信奉分享是成长的唯一捷径,在这里也希望我的每一篇文章都能成为你技术落地的参考~

目录

    • 1. 准备工作
      • 1. 初始化项目:
        • 1.1 初始化环境:
        • 1.2 安装核心模块:
      • 2. 初始化容器及LogicFlow对象:
        • 2.1 准备容器:
        • 2.2 导入模块:
        • 2.3 实例化&渲染:
        • 2.4 预览效果:
    • 2. 自定义业务节点:
      • 2.1 准备自定义模板:
      • 2.2 优先注册&使用:
      • 2.3 自定义样式:
      • 2.4 自定义形状:
      • 2.5 自定义外观:
      • 2.6 最终预览:

1. 准备工作

1. 初始化项目:

1.1 初始化环境:

使用pnpm create vite创建项目,选择Vue框架及TypeScript变体;

1.2 安装核心模块:

安装核心模块:pnpm add @logicflow/core

2. 初始化容器及LogicFlow对象:

2.1 准备容器:

准备一个container容器,并通过css初始化容器的尺寸;

<template><div ref="container" class="container"></div>
</template><style scoped>
.container {width: 500px;height: 400px;
}
</style>

2.2 导入模块:

导入LogicFlow和对应的样式依赖模块;

<script setup lang="ts">
import LogicFlow from "@logicflow/core";
import "@logicflow/core/dist/style/index.css";
</script>

2.3 实例化&渲染:

onMounted后对LogicFlow对象实例化并进行渲染,为了能看到初始容器建议开启grid选项;

<script setup lang="ts">
import { onMounted, ref } from "vue";const container = ref();
const lf = ref<LogicFlow>();onMounted(() => {lf.value = new LogicFlow({container: container.value,grid: true,})lf.value.render();
})
</script>

2.4 预览效果:

启动项目后在浏览器访问即可看到这个500*400的点阵图,这个就是后面绘制节点的区域;

image.png

2. 自定义业务节点:

2.1 准备自定义模板:

准备自定义业务节点模板,分别继承RectNodeRectNodeModel并导出typeviewmodel三个选项:

import { RectNode, RectNodeModel } from "@logicflow/core";class CustomNodeView extends RectNode {}class CustomNodeModel extends RectNodeModel {}export default {type: "CustomNode",view: CustomNodeView,model: CustomNodeModel,
}

2.2 优先注册&使用:

优先进行注册并定义数据,方便自定义业务节点实时预览;

<script setup lang="ts">
// 导入自定义节点
import CustomNode from "./nodes/CustomNode";// 定义graphData
// 数据中的type为自定义节点导出的type属性的值
// 将节点在坐标为(100,100)的位置显示
const graphData = {nodes: [{id: 'fba7fc7b-83a8-4edd-b4be-21f694a5d490',type: 'CustomNode',x: 100,y: 100}]
}onMounted(() => {// 在执行render前进行注册lf.value.register(CustomNode);lf.value.render(graphData);
})
</script>

tip:此时的容器正常情况下就已经渲染出100*80的矩形节点了;

2.3 自定义样式:

自定义业务节点的样式(绿色描边),需要重写RectNodeModel类中的getNodeStyle()函数;

getNodeStyle() {const style = super.getNodeStyle();style.stroke = 'green';return style;
}

tip:此时的矩形的边框将变成绿色;
image.png

2.4 自定义形状:

自定义业务节点的形状(圆角矩形),需要重写RectNodeModel类中的initNodeData(data: any)函数;

initNodeData(data: any): void {super.initNodeData(data);this.width = 120;this.height = 80;this.radius = 10;
}

tip:此时的矩形将获得圆角并且默认的尺寸将变成120*80
image.png

2.5 自定义外观:

自定义业务节点的外观可以实现更加个性化的显示效果,可以通过重写RectNode类中的getShape()并借助LogicFlow提供的h函数来实现个性化效果的渲染;

  1. 第一步:使用h函数渲染重写getShape前的外观;rect的原点与graphData原点非同一个点,需要转换;
getShape() {// 获取XxxNodeModel中定义的形状属性const { model } = this.props;const { x, y, width, height, radius } = model;// 获取XxxNodeModel中定义的样式属性const style = model.getNodeStyle();return h('g', {}, [h('rect', {...style,x: x - width / 2,y: y - height / 2,width,height,rx: radius,ry: radius,})]);
}
  1. 在现在矩形节点的左上角增加一个自定义的Icon,可以在iconfont找一个喜欢的Icon,并拷贝其SVG数据,再通过h函数重写并渲染;
h('svg', {x: x - width / 2 + 5,y: y - height / 2 + 5,width: 25,height: 25,viewBox: "0 0 1028 1024",
}, [h('path', {fill: style.stroke,d: "M20.6692 180.672c-27.104 27.136-21.312 65.344 0.256 86.88 0.864 0.832 87.488 83.584 209.312 205.408 3.136 3.136 7.232 4.672 11.328 4.672s8.192-1.568 11.328-4.672c6.24-6.24 6.24-16.384 0-22.624-18.368-18.368-35.84-35.744-52.416-52.192l50.848-50.848c6.24-6.24 6.24-16.384 0-22.624s-16.384-6.24-22.624 0l-50.976 50.976c-28.512-28.16-53.632-52.736-74.08-72.672l115.68-115.68c6.24-6.24 6.24-16.384 0-22.624s-16.384-6.24-22.624 0l-116.032 116.032c-23.552-22.816-37.12-35.776-37.344-36-6.752-6.752-15.616-25.76 0-41.376l160-160c6.176-6.272 22.624-18.72 40.672-0.768 0.8 0.896 81.6 92.672 204.928 216 6.24 6.24 16.384 6.24 22.624 0s6.24-16.384 0-22.624c-122.56-122.528-202.752-213.6-204.224-215.264-29.824-29.76-65.792-20.832-86.624 0l-160.032 160zM699.3252 772.672c-6.24-6.24-16.384-6.24-22.624 0l-50.912 50.88c-15.52-15.712-31.808-32.16-48.96-49.312-6.24-6.24-16.384-6.24-22.624 0s-6.24 16.384 0 22.624c118.528 118.496 201.312 207.008 202.496 208.288 10.976 11.008 26.016 17.056 42.336 17.056l0 0c16.8 0 33.792-6.56 44.32-17.12l159.936-161.824c20.128-20.128 21.28-54.272 2.496-73.12l-214.592-214.56c-6.24-6.24-16.384-6.24-22.624 0s-6.24 16.384 0 22.624l214.592 214.56c6.4 6.4 5.184 20.224-2.528 27.936l-159.968 161.824c-3.68 3.712-12.032 7.68-21.632 7.68 0 0 0 0 0 0-5.504 0-13.376-1.344-19.328-7.328-0.32-0.352-13.728-14.656-36.992-39.008l116.608-116.608c6.24-6.24 6.24-16.384 0-22.624s-16.384-6.24-22.624 0l-116.128 116.128c-19.968-20.768-44.448-46.016-72.32-74.432l51.072-51.072c6.24-6.208 6.24-16.32 0-22.592zM4.5412 1018.528c3.072 3.136 7.2 4.8 11.456 4.8 1.536 0 3.072-0.224 4.576-0.672l320-95.328c2.592-0.768 4.896-2.144 6.784-4.064l546.88-550.56c0.768-0.768 1.152-1.76 1.728-2.624l116.992-116.992c9.408-9.44 14.624-21.952 14.624-35.296s-5.216-25.824-14.624-35.2l-167.52-167.488c-18.816-18.816-51.68-18.816-70.496 0l-119.648 119.648c-0.768 0.768-1.184 1.76-1.76 2.656l-547.712 547.744c-1.792 1.792-3.136 3.968-3.904 6.368l-101.12 310.88c-1.856 5.664-0.416 11.84 3.744 16.128zM667.5172 168.672l33.248 33.248-496.736 498.08-55.264-12.544 518.752-518.784zM223.9972 725.312l499.424-500.736 77.952 77.952-503.936 497.472-73.44 0 0-74.688zM860.2852 361.472l-519.808 523.328-18.464-64.064 501.984-495.584 36.288 36.32zM127.7732 715.488l64.224 14.592 0 85.92c0 8.832 7.168 16 16 16l83.968 0 20.288 70.4-271.616 80.928 87.136-267.84zM797.5972 37.728c6.752-6.752 18.496-6.752 25.248 0l167.52 167.52c3.36 3.36 5.216 7.84 5.216 12.608 0 4.736-1.856 9.248-5.248 12.64l-107.872 107.904-192.736-192.736 107.872-107.936z",})
])

2.6 最终预览:

至此这个新的自定义业务节点就完成了,这种风格的业务节点也是大多数流程管理系统中常见的风格;接着补充一下graphData数据,来看一下最终效果~

const graphData = {nodes: [{id: 'fba7fc7b-83a8-4edd-b4be-21f694a5d490',type: 'CustomNode',x: 100,y: 100},{id: '681035e6-11e3-43d7-9392-1deed852c01a',type: 'CustomNode',x: 300,y: 100}],edges: [{sourceNodeId: 'fba7fc7b-83a8-4edd-b4be-21f694a5d490',targetNodeId: '681035e6-11e3-43d7-9392-1deed852c01a',type: 'polyline'}]
}

image.png


如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力~


http://www.ppmy.cn/news/171312.html

相关文章

STM32驱动LD3320进行语音识别程序+原理图

一、原理图 二、源代码 LD3320.c #include "ld3320.h" #include "delay.h" #include "usart.h" #include "string.h" u8 ld3320Data; extern u8 nAsrStatus;unsigned long nMp3StartPos0; unsigned long nMp3Size0; unsigned long …

A_A02_003 ST-LINK驱动安装

A_A02_003 ST-LINK驱动安装 一、驱动下载二、交流学习三、驱动安装步骤四、检测是否成功安装五、驱动更新六、注意事项 一、驱动下载 网盘下载 戳它跳转 提取码&#xff1a;osjy 其他所有资料获取 直戳获取 二、交流学习 安装过程如有疑问&#xff0c;可留言或者私聊交流 三…

SpringData 基础篇

Spring Data 故事背景一&#xff1a;基础概念1.1 什么是SpringData1.2 为什么要用SpringData 二&#xff1a;JPA与Hibernate、MyBatis关系2.1 JPA与JDBC2.1.1 特点2.1.2 JPA规范提供2.1.3 JDBC的不足 2.2 Hibernate与JPA2.2.1 关系 2.3 mybatis 和Hibernate 三&#xff1a;Hibe…

预约直播|揭秘鸿蒙全新流量阵地,元服务带来的体验变革

【导读】 在PC 互联网到移动互联网的演进过程&#xff0c;随着人们对交互和信息获取的智能化要求越来越高&#xff0c;移动终端上的应用生态发展到今天也面临着变革。传统厚重的App&#xff0c;功能齐全&#xff0c;但开发成本高、周期长&#xff0c;且存在搜索、安装、卸载等…

realme X50 5G 打开USB调式步骤

进入"设置", 点击关于手机点击"版本信息(基带,内核版本等)"连续点击7次"版本号"即打开"USB调试模式"(锁屏密码开启的需要输入密码)在"设置"中找到"其他设置", 并点击进入找到并点击"开发者选项"找到并打…

zenfone5 android,华硕ZenFone5三款齐发:骁龙845+刘海屏!

本届MWC展会上&#xff0c;众多新机集体亮相让人眼花缭乱&#xff0c;而继续三星、索尼之后&#xff0c;又一家厂商发布了搭载骁龙845的旗舰&#xff0c;而它就是华硕&#xff0c;不过相比前两者来说&#xff0c;他们的新机更有特点。 华硕刚刚发布的ZenFone5Z、ZenFone5最大的…

华硕ROG 魔霸 6 2022 款

ROG 魔霸 6 系列和 ROG 魔霸 6 Plus 最高搭载 AMD 锐龙 9 6900HX 和 150W NVIDIA GeForce RTX 3070 Ti 显卡&#xff0c;同样支持 Dynamic Boost2.0&#xff0c;支持双显三模。华硕ROG 魔霸 6 新吕活动688红包等你抢机会不容错过http://www.adiannao.cn/dy 屏幕方面&#xff0…

华硕灵耀 Pro16 2022评测

华硕灵耀 Pro 16 定位高性能轻薄创作笔记本&#xff0c;新配置搭载了搭载 14 核 20 线程的 i7-12700H 处理器&#xff0c;性能释放可达 80W&#xff0c;辅以 RTX 3060 显卡&#xff0c;支持独显直连&#xff0c;机身厚度薄至 17.9mm&#xff0c;重量约为 1.97kg。华硕灵耀 Pro1…