Vue使用konva實(shí)現(xiàn)一個(gè)簡便的流程圖
konva
Konva是一個(gè)Canvas相關(guān)庫,該庫提供了各種動(dòng)畫、綁定事件等用于繪制圖形.使用起來也很方便,如果你了解Canvas語法就能快速上手,不了解也沒關(guān)系,Canvas相關(guān)的是圖形屬性的設(shè)置,跟著文檔進(jìn)行設(shè)置即可。 konva的構(gòu)造很簡單,首先我們先了解一下相關(guān)概念:
- state:數(shù)據(jù)的根節(jié)點(diǎn)。
- layer(圖層):子節(jié)點(diǎn)數(shù)據(jù),里面包含著具體的圖形或圖形組。
- grops(組):圖形組,由多個(gè)圖形組成,我們可以給一組內(nèi)的圖形設(shè)置樣式或事件。
- shapes(圖形):圖形,繪制到頁面的圖形,比如圓形、矩形等。圖形的屬性設(shè)置就跟Cansvas屬性一樣。konva對(duì)象是樹狀結(jié)構(gòu),具體構(gòu)造類似于節(jié)點(diǎn),由以上屬性構(gòu)成。
konva的工作原理與創(chuàng)造步驟也就是如此,根據(jù)數(shù)據(jù)結(jié)構(gòu)我們可以寫一個(gè)簡單的demo。
啟動(dòng)項(xiàng)目我們就能看到一個(gè)紅色矩形。
上述代碼中我們就在圖層中嵌入了一個(gè)矩形,而矩形的屬性項(xiàng)就是Canvas相關(guān)屬性。下面我們嵌入一個(gè)組:
以上就是konva繪制圖形的過程,總結(jié)來說起來就是:創(chuàng)建state-->layer-->group/shape-->add添加-->layer.drwo()繪制。圖形的具體語法可以查閱文檔。除此之外,konva還有對(duì)應(yīng)vue版本、與react版本。
流程圖
如果我們繪制的流程圖主要用于展示、交互很少,那么konva繪制流程圖跟Canvas差不多,下面我們就用konva實(shí)現(xiàn)一個(gè)流程圖。
常量屬性
對(duì)于流程圖里的圖形來說,有些屬性值比如:顏色、半徑、線寬大部分圖形是一樣的,針對(duì)這些值我們聲明一個(gè)對(duì)象保存,如果需要修改某個(gè)屬性值,直接修改對(duì)象中對(duì)應(yīng)的屬性即可。
const defaultConfig = { radius: 30, //圓半徑 arrowRadius: 10, //箭頭圓半徑 rectWith: 60, // 矩形的寬 rectHeight: 40,// 矩形的高 yellow: 'rgb(254, 187, 29)', blue: 'rgb(0,117,255)', grey: 'rgb(155,162,160)' }
組裝
流程圖的繪制很簡單,由一個(gè)個(gè)圖形組裝起來的,根據(jù)具體的需求我們將流程圖分為n個(gè)圖形,通過圖形的x、y屬性組裝起來。比如我們來實(shí)現(xiàn)一個(gè)開始->結(jié)束的簡單流程。 開始、結(jié)束我們就用defaultConfig里面的屬性,節(jié)點(diǎn)之間的連接直接用konva的Arrow箭頭進(jìn)行連接。
上面流程圖由五部分構(gòu)成,矩形跟文字是一組的,文字的位置是相對(duì)于矩形位置設(shè)置,以此來保證文字居中,箭頭跟兩個(gè)矩形之間的連接是通過坐標(biāo)確認(rèn)的,圖形與圖形之間的坐標(biāo)構(gòu)成了流程圖。流程圖的拼接就是去計(jì)算各個(gè)坐標(biāo),知道了這點(diǎn)碰到復(fù)雜點(diǎn)的流程圖我們只要梳理好各個(gè)圖形的坐標(biāo)就能繪制出來。
封裝
上面例子中只有兩個(gè)流程節(jié)點(diǎn),但是我們聲明了四個(gè)常量,節(jié)點(diǎn)一多常量也會(huì)更加得多,并且聲明的變量主要區(qū)別就是坐標(biāo)的變動(dòng),所以我們可以把創(chuàng)建節(jié)點(diǎn)封裝成一個(gè)函數(shù),將坐標(biāo)等屬性當(dāng)成參數(shù)。按照此思路,我們把創(chuàng)建過程封裝成一個(gè)類,想要去繪制時(shí),直接new一個(gè),傳入相關(guān)配置。
export class DrawGraph { el: any | string layer: Layer items: any[] stage: Stage constructor(el: string | HTMLDivElement) { if (typeof el === 'string') { this.el = document.querySelector(el) } else { this.el = el } this.layer = new Layer() this.items = [] this.stage = new Stage({ container: this.el, width: 500, height: 500, }) } }
首先我們創(chuàng)建根節(jié)點(diǎn)stage與圖層layer,items用來保存每個(gè)流程節(jié)點(diǎn),接下來聲明創(chuàng)建矩形與箭頭的函數(shù)。
id就是每個(gè)節(jié)點(diǎn)的唯一標(biāo)識(shí),type表示圖形類型,shape表示圖形組。接下來就是我們根據(jù)配置項(xiàng)去聲明一個(gè)渲染函數(shù)。
// 渲染圖表 render = (processConfig: any[]) => { // 循環(huán)創(chuàng)建圖表 processConfig.forEach((item: { type: any; params: any }) => { const { type, params } = item this['create' + type](params) }) this.stage.add(this.layer) this.layer.draw() }
precessConfig表示用來聲明節(jié)點(diǎn)的配置項(xiàng),我們用封裝好的類再次實(shí)現(xiàn)上面的流程圖。
const initGraph = () => { const config = document.querySelector('#wrapper') as HTMLDivElement const graph = new DrawGraph(config) graph.render(processConfig) } onMounted(() => { initGraph() })
這樣做代碼的可讀性大大提升了,后續(xù)維護(hù)起來也很方便,想要添加哪種圖形就添加對(duì)應(yīng)的函數(shù),具體的api就去查官方文檔。
總結(jié)
以上就是konva實(shí)現(xiàn)一個(gè)流程圖的方法,文中的例子只是簡單用了下konva,konva本身還有很多功能,可以讓我們?nèi)?shí)現(xiàn)更加復(fù)雜的需求。
到此這篇關(guān)于Vue使用konva實(shí)現(xiàn)一個(gè)簡便的流程圖的文章就介紹到這了,更多相關(guān)Vue konva流程圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+Echarts實(shí)現(xiàn)繪制動(dòng)態(tài)折線圖
這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Echarts實(shí)現(xiàn)繪制動(dòng)態(tài)折線圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03詳解10分鐘學(xué)會(huì)vue滾動(dòng)行為
本篇文章主要介紹了vue滾動(dòng)行為,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09vue store之狀態(tài)管理模式的詳細(xì)介紹
這篇文章主要介紹了vue store之狀態(tài)管理模式的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Vue3如何使用axios發(fā)起網(wǎng)絡(luò)請(qǐng)求
這篇文章主要介紹了Vue3如何使用axios發(fā)起網(wǎng)絡(luò)請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06