konva实现一个流程图

前言

日常开发中我们可能碰到流程图的需求,实现流程图的库有很多,如果我们想要实现一个简便的流程图可以使用konva库来实现,下面我们就来看一下具体的实现过程。

konva

Konva是一个Canvas相关库,该库提供了各种动画、绑定事件等用于绘制图形.使用起来也很方便,如果你了解Canvas语法就能快速上手,不了解也没关系,Canvas相关的是图形属性的设置,跟着文档进行设置即可。 konva的构造很简单,首先我们先了解一下相关概念:

  • state:数据的根节点。
  • layer(图层):子节点数据,里面包含着具体的图形或图形组。
  • grops(组):图形组,由多个图形组成,我们可以给一组内的图形设置样式或事件。
  • shapes(图形) :图形,绘制到页面的图形,比如圆形、矩形等。图形的属性设置就跟Cansvas属性一样。
    konva对象是树状结构,具体构造类似于节点,由以上属性构成。
    konva的工作原理与创造步骤也就是如此,根据数据结构我们可以写一个简单的demo。

启动项目我们就能看到一个红色矩形。

上述代码中我们就在图层中嵌入了一个矩形,而矩形的属性项就是Canvas相关属性。下面我们嵌入一个组:

以上就是konva绘制图形的过程,总结来说起来就是:创建state-->layer-->group/shape-->add添加-->layer.drwo()绘制。图形的具体语法可以查阅文档。除此之外,konva还有对应vue版本、与react版本

流程图

如果我们绘制的流程图主要用于展示、交互很少,那么konva绘制流程图跟Canvas差不多,下面我们就用konva实现一个流程图。

常量属性

对于流程图里的图形来说,有些属性值比如:颜色、半径、线宽大部分图形是一样的,针对这些值我们声明一个对象保存,如果需要修改某个属性值,直接修改对象中对应的属性即可。

js 复制代码
   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)'
}

组装

流程图的绘制很简单,由一个个图形组装起来的,根据具体的需求我们将流程图分为n个图形,通过图形的x、y属性组装起来。比如我们来实现一个开始->结束的简单流程。 开始、结束我们就用defaultConfig里面的属性,节点之间的连接直接用konva的Arrow箭头进行连接。

上面流程图由五部分构成,矩形跟文字是一组的,文字的位置是相对于矩形位置 设置,以此来保证文字居中,箭头跟两个矩形之间的连接是通过坐标确认的,图形与图形之间的坐标构成了流程图。流程图的拼接就是去计算各个坐标,知道了这点碰到复杂点的流程图我们只要梳理好各个图形的坐标就能绘制出来。

封装

上面例子中只有两个流程节点,但是我们声明了四个常量,节点一多常量也会更加得多,并且声明的变量主要区别就是坐标的变动,所以我们可以把创建节点封装成一个函数,将坐标等属性当成参数。按照此思路,我们把创建过程封装成一个类,想要去绘制时,直接new一个,传入相关配置。

js 复制代码
   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,
        })
      }
  }

首先我们创建根节点stage与图层layer,items用来保存每个流程节点,接下来声明创建矩形与箭头的函数。

id就是每个节点的唯一标识,type表示图形类型,shape表示图形组。接下来就是我们根据配置项去声明一个渲染函数。

js 复制代码
   // 渲染图表
  render = (processConfig: any[]) => {
    // 循环创建图表
    processConfig.forEach((item: { type: any; params: any }) => {
      const { type, params } = item
      this['create' + type](params)
    })
    this.stage.add(this.layer)
    this.layer.draw()
  }

precessConfig表示用来声明节点的配置项,我们用封装好的类再次实现上面的流程图。

js 复制代码
   const initGraph = () => {
  const config = document.querySelector('#wrapper') as HTMLDivElement
  const graph = new DrawGraph(config)
  graph.render(processConfig)
}
onMounted(() => {
  initGraph()
})

这样做代码的可读性大大提升了,后续维护起来也很方便,想要添加哪种图形就添加对应的函数,具体的api就去查官方文档。

总结

以上就是konva实现一个流程图的方法,文中的例子只是简单用了下konva,konva本身还有很多功能,可以让我们去实现更加复杂的需求。

相关推荐
SRC_BLUE_178 分钟前
UPLOAD LABS | PASS 01 - 绕过前端 JS 限制
开发语言·前端·javascript
NetX行者9 分钟前
Vue3+Typescript+Axios+.NetCore实现导出Excel文件功能
前端·typescript·c#·excel·.netcore
美团测试工程师22 分钟前
Fiddler导出JMeter脚本插件原理
前端·jmeter·fiddler
余生H1 小时前
Angular v19 (二):响应式当红实现signal的详细介绍:它擅长做什么、不能做什么?以及与vue、svelte、react等框架的响应式实现对比
前端·vue.js·react.js·angular.js
聚宝盆_1 小时前
【记录:前端提高用户体验】
前端·css
GISer_Jing2 小时前
Vue前端进阶面试题(六)
前端·javascript·vue.js
之诚2 小时前
使用Gradle编译前端的项目
前端·vue·gradle
FenceRain2 小时前
uniapp 扩展picker-view实现条件查询
前端·javascript·uni-app
喵喵酱仔__3 小时前
uniapp echarts tooltip formation 不识别html
前端·javascript·echarts
new出一个对象3 小时前
uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?
前端·uni-app