vue開發(fā)之LogicFlow自定義業(yè)務(wù)節(jié)點(diǎn)
推薦幾個好用的工具
- var-conv 適用于VSCode IDE的代碼變量名稱快速轉(zhuǎn)換工具
- generator-vite-plugin 快速生成Vite插件模板項(xiàng)目
- generator-babel-plugin 快速生成Babel插件模板項(xiàng)目
進(jìn)入正題
LogicFlow 是一款流程圖編輯框架,提供了一系列流程圖交互、編輯所必需的功能和靈活的節(jié)點(diǎn)自定義、插件等拓展機(jī)制。LogicFlow支持前端研發(fā)自定義開發(fā)各種邏輯編排場景,如流程圖、ER圖、BPMN流程等。在工作審批配置、機(jī)器人邏輯編排、無代碼平臺流程配置都有較好的應(yīng)用。
這一節(jié)將講解快速上手 LogicFlow 流程圖編輯框架的自定義業(yè)務(wù)節(jié)點(diǎn)內(nèi)容,代碼要在上一節(jié)的基礎(chǔ)上進(jìn)行開發(fā),使用1024code在線編寫代碼的小伙伴可以直接fork上一節(jié)的代碼開始,這一節(jié)的大致內(nèi)容包括了,準(zhǔn)備自定義業(yè)務(wù)節(jié)點(diǎn)的模板、注冊和使用、自定義樣式、自定義形狀、自定義外觀幾個方面,做好準(zhǔn)備后我們就開始了。
1. 認(rèn)識自定義業(yè)務(wù)節(jié)點(diǎn)模板:
LF框架自定義業(yè)務(wù)節(jié)點(diǎn)使用到了面向?qū)ο笾欣^承的概念,通過繼承LF提供的 XxxNode 和 XxxNodeModel 類后對相關(guān)的函數(shù)進(jìn)行重寫,并在默認(rèn)導(dǎo)出時提供 type、view 和 model`;
下面這段代碼繼承了Rect相關(guān)的 RectNode 和 RectNodeModel,如果要繼承其他的內(nèi)置對象還請查看官方文檔或源碼:
// 源碼位置:./src/CustomNode.ts
import { RectNode, RectNodeModel } from "@logicflow/core";
class CustomNodeView extends RectNode {
}
class CustomNodeModel extends RectNodeModel {
}
export default {
type: "CustomNode",
view: CustomNodeView,
model: CustomNodeModel,
}
2. 優(yōu)先進(jìn)行注冊和使用:
自定義業(yè)務(wù)模板準(zhǔn)備好以后就可以先進(jìn)行注冊和使用了,第一個是因?yàn)樵诶^承內(nèi)置類后雖然沒有進(jìn)行任何的函數(shù)重寫但是不耽誤渲染結(jié)果;第二個是因?yàn)橐婚_始并不熟悉,所以要及時注冊和使用起來看到效果,也是方便后續(xù)的自定義。
2.1 注冊自定義業(yè)務(wù)節(jié)點(diǎn):
注冊過程主要分兩個步驟:
- 第一要將上面編寫的
CustomNode.ts導(dǎo)入到App.vue; - 第二要將
CustomNode對象通過lf實(shí)例中的register()函數(shù)在render()前注冊;
// 導(dǎo)入自定義節(jié)點(diǎn)
import CustomNode from "./CustomNode";
const graphData = {}
...
onMounted(() => {
// 在執(zhí)行render前進(jìn)行注冊
lf.value.register(CustomNode);
lf.value.render(graphData);
})
2.2 如何使用自定義業(yè)務(wù)節(jié)點(diǎn):
在成功注冊后即可通過 render 函數(shù)來渲染業(yè)務(wù)流程中的一切元素的數(shù)據(jù),自定義的業(yè)務(wù)節(jié)點(diǎn)和內(nèi)置的默認(rèn)節(jié)點(diǎn)使用方式相同,都是通過 type 選項(xiàng)來標(biāo)識;
// 定義graphData
// 數(shù)據(jù)中的type為自定義節(jié)點(diǎn)導(dǎo)出的type屬性的值
// 將節(jié)點(diǎn)在坐標(biāo)為(100,100)的位置顯示
const graphData = {
nodes: [
{
id: 'fba7fc7b-83a8-4edd-b4be-21f694a5d490',
type: 'CustomNode',
x: 100,
y: 100
}
]
}
3. 自定義業(yè)務(wù)節(jié)點(diǎn)樣式:
自定義業(yè)務(wù)節(jié)點(diǎn)樣式(綠色描邊),需要重寫 RectNodeModel 類中的 getNodeStyle() 函數(shù),通過關(guān)鍵詞 super 獲取到父類中的節(jié)點(diǎn)樣式,并改變 stroke 的值為綠色,最后將修改完成的 style 返回;
class CustomNodeModel extends RectNodeModel {
getNodeStyle() {
const style = super.getNodeStyle();
style.stroke = 'green';
return style;
}
}
4. 自定義業(yè)務(wù)節(jié)點(diǎn)形狀:
自定義業(yè)務(wù)節(jié)點(diǎn)形狀(圓角矩形)和自定義業(yè)務(wù)節(jié)點(diǎn)樣式一樣的簡單,重寫RectNodeModel類中的initNodeData(data: any)函數(shù)就可以了;
class CustomNodeModel extends RectNodeModel {
initNodeData(data: any): void {
super.initNodeData(data);
this.width = 120;
this.height = 80;
this.radius = 10;
}
}
5. 自定義業(yè)務(wù)節(jié)點(diǎn)外觀:
前面的自定義業(yè)務(wù)節(jié)點(diǎn)樣式和形狀都是在原有內(nèi)置對象的基礎(chǔ)上進(jìn)行屬性的調(diào)整,為了實(shí)習(xí)更高的自定義的外觀,需要用到類似 Vue 中的 h 函數(shù)(渲染函數(shù)),通過重寫 RectNode 中的 Shape() 并借助渲染函數(shù)實(shí)現(xiàn)外觀的自定義;
- 第一步:重寫
getShape函數(shù),獲取props中存儲的當(dāng)前節(jié)點(diǎn)的信息,如位置、尺寸和樣式等; - 第二步:節(jié)點(diǎn)的外觀要基于
SVG實(shí)現(xiàn),下面的案例要在業(yè)務(wù)組件左上角顯示一個ICON,ICON可以從iconfont找一個自己喜歡的;
class CustomNodeView extends RectNode {
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,
})
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: "<icon-svg-data>",
})
])
]);
}
}
6. 重啟項(xiàng)目預(yù)覽效果:
至此自定義業(yè)務(wù)節(jié)點(diǎn)基本完成,這種樣式也是大多數(shù)流程管理系統(tǒng)中常見的一種風(fēng)格,接著補(bǔ)充一下 graphData 數(shù)據(jù),來看一下最終的效果~
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'
}
]
}

總結(jié)
這一節(jié)的內(nèi)容就到此結(jié)束了,自定義業(yè)務(wù)節(jié)點(diǎn)的樣式、形狀和外觀都搞定了嗎?尤其是外觀的自定義需要渲染 SVG 標(biāo)簽,所以掌握一些 SVG 相關(guān)的數(shù)據(jù)或掌握使用工具的生成 SVG 數(shù)據(jù)還是很有必要的,感覺把這一節(jié)的代碼熟悉熟悉,接著要對 LF中的 Edge 進(jìn)行自定義了。
以上就是vue開發(fā)之LogicFlow自定義業(yè)務(wù)節(jié)點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于LogicFlow自定義業(yè)務(wù)節(jié)點(diǎn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue3 去除 vue warn 及生產(chǎn)環(huán)境去除console.log的方法
這篇文章主要介紹了Vue3 去除 vue warn 及生產(chǎn)環(huán)境去除console.log的方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
vite+vue3項(xiàng)目集成ESLint與prettier的過程詳解
這篇文章主要介紹了vite+vue3項(xiàng)目中集成ESLint與prettier的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Vue子級如何向父級傳遞數(shù)據(jù)(自定義事件)
這篇文章主要介紹了Vue子級如何向父級傳遞數(shù)據(jù)(自定義事件),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
vue項(xiàng)目中按需引入element-ui的正確實(shí)現(xiàn)方法
這篇文章主要介紹了vue項(xiàng)目中按需引入element-ui的正確實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Vue過濾器(filter)實(shí)現(xiàn)及應(yīng)用場景詳解
在Vue中使用過濾器(Filters)來渲染數(shù)據(jù)是一種很有趣的方式,下面這篇文章主要給大家介紹了關(guān)于Vue過濾器(filter)實(shí)現(xiàn)及應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下2021-06-06
使用vue腳手架(vue-cli)搭建一個項(xiàng)目詳解
這篇文章主要介紹了vue腳手架(vue-cli)搭建項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
使用vue實(shí)現(xiàn)簡單鍵盤的示例(支持移動端和pc端)
這篇文章主要介紹了使用vue實(shí)現(xiàn)簡單鍵盤的示例(支持移動端和pc端),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
詳解vue中使用express+fetch獲取本地json文件
本篇文章主要介紹了詳解vue中使用express+fetch獲取本地json文件,非常具有實(shí)用價值,需要的朋友可以參考下2017-10-10

