Vue使用konva实现一个简便的流程图

 更新时间:2023年08月29日 08:55:53   作者:躺平使者  
日常开发中我们可能碰到流程图的需求,实现流程图的库有很多,如果我们想要实现一个简便的流程图可以使用konva库来实现,下面我们就来看一下具体的实现过程,需要的朋友可以参考下

konva

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

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

1693141929050.png

konva的工作原理与创造步骤也就是如此,根据数据结构我们可以写一个简单的demo。

1693144060632.png

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

1693144200029.png

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

1693149331606.png

1693149375497.png

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

流程图

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

常量属性

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

   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箭头进行连接。

1693214304999.png

1693214395125.png

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

封装

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

   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用来保存每个流程节点,接下来声明创建矩形与箭头的函数。

1693217135671.png

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

   // 渲染图表
  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表示用来声明节点的配置项,我们用封装好的类再次实现上面的流程图。

1693218510413.png

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

1693218605743.png

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

总结

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

到此这篇关于Vue使用konva实现一个简便的流程图的文章就介绍到这了,更多相关Vue konva流程图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue cli3.0打包上线静态资源找不到路径的解决操作

    vue cli3.0打包上线静态资源找不到路径的解决操作

    这篇文章主要介绍了vue cli3.0打包上线静态资源找不到路径的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • VUE3引入html文件并传值方法举例

    VUE3引入html文件并传值方法举例

    这篇文章主要给大家介绍了关于VUE3引入html文件并传值的相关资料,这是最近在项目中遇到了的一个需求,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • vue 使用v-if切换输入框时导致输入框的数据内容没有清空的问题解决(两种解决方法)

    vue 使用v-if切换输入框时导致输入框的数据内容没有清空的问题解决(两种解决方法)

    这篇文章主要介绍了vue 使用v-if切换输入框时导致输入框的数据内容没有清空的问题解决,本文给大家分享两种解决方法,需要的朋友可以参考下
    2023-05-05
  • 封装一下vue中的axios示例代码详解

    封装一下vue中的axios示例代码详解

    这篇文章主要介绍了封装一下vue中的axios,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Vue首页界面加载优化实现方法详解

    Vue首页界面加载优化实现方法详解

    如果你也遇到在 vue 应用中,首页加载资源过多,导致加载缓慢的问题,下面的方法也许能帮到你,主要的处理思想是:让首页多余的资源能在需要它的时候再加载
    2022-09-09
  • VUE引入第三方js包及调用方法讲解

    VUE引入第三方js包及调用方法讲解

    今天小编就为大家分享一篇关于VUE引入第三方js包及调用方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • vue-socket.io接收不到数据问题的解决方法

    vue-socket.io接收不到数据问题的解决方法

    这篇文章主要介绍了解决vue-socket.io接收不到数据问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Vue基础知识快速入门教程

    Vue基础知识快速入门教程

    这篇文章主要介绍了Vue基础知识快速入门教程,我们可以先学会用,使用一段时间之后,回头来熟悉一下Vue框架以及它的特点,需要的朋友可以参考下
    2023-05-05
  • Vue js with语句原理及用法解析

    Vue js with语句原理及用法解析

    这篇文章主要介绍了Vue js with语句原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 基于vue配置axios的方法步骤

    基于vue配置axios的方法步骤

    这篇文章主要介绍了基于vue配置axios的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论