Svelvet的核心概念介绍及用Svelvet构建流程图的教程

214 阅读8分钟

Svelte是基于JavaScript构建的最流行的框架之一。虽然它早在2016年就被推出,但在前端领域,它仍被认为是一个相对较新的框架(与React、Vue.js和其他框架相比)。

尽管姗姗来迟,但Svelte的友好语法和出色的性能使其无法被忽视。但是,即使有了良好的声誉,Svelte生态系统发现自己在努力跟上当代工具的步伐,并需要更多的时间来匹配其同行的工具箱规模。

幸运的是,Svelte社区努力通过不断引入新的、有用的工具来保持框架的相关性,希望能够弥补其他框架之间的差距。其中一个例子是Svelvet,这是一个最近推出的组件库,可以在Svelte中轻松创建华丽的、可定制的流程图。

在这篇文章中,我们将介绍Svelvet的核心概念,并演示如何使用Svelvet在Svelte中构建流程图。

目录

前提条件

要继续学习本教程,你需要对Svelte及其概念有一个基本的了解。

什么是Svelvet?

Svelvet是一个轻量级组件库,用于在Svelte中渲染基于节点的交互式流程图。该库使用一个基于图形的编辑器来转换、分析和可视化数据。它还利用了D3.js的缩放和选择组件来提供图形上的平滑缩放和平移行为。

Svelvet的创造者称,该库的建立是为了满足Svelte对类似React flow的图表工具的需求,Reactflow是一个基于节点的图形渲染器。因此,Svelvet具有与React flow类似的功能和特点,例如:

  • 易用性
  • 易于定制
  • 互动性
  • 快速渲染

现在我们对Svelvet有了基本的了解,让我们看看如何将其添加到我们的项目中,并开始渲染流程图。

开始使用

你可以通过npm或Yarn在你的项目中安装Svelvet,使用以下命令之一:

npm install svelvet
yarn add svelvet

如果你还没有建立一个项目,你可以启动一个Svelte项目,就像这样:

npx degit sveltejs/template

然后,安装依赖项:

npm install

接下来,你可以将Svelvet集成到你的Svelte项目中,方法是在你项目文件夹中的任何组件的脚本部分中导入一个Svelvet 组件。

import Svelvet from 'svelvet';

Svelvet 组件接受几个道具,但nodesedges 属性是该组件的实际构建块。该组件的nodesedges 根据其指定的值来渲染图形。

下面是Svelvet 组件的一个基本用法。

<script>
  import Svelvet from 'svelvet';

  const initialNodes = [
    {
    id: 1,
    position: { x: 350, y: 50 },
    data: { label: 'input Node' },
    width: 175,
    height: 40,
    bgColor: 'white'
    },
    {
    id: 2,
    position: { x: 350, y: 150 },
    data: { label: 'Default Node' },
    width: 175,
    height: 40,
    bgColor: 'white'
    }
];

  const initialEdges = [
    { id: 'e1-2', source: 1, target: 2, type: 'default', label: 'label'},
];
</script>

<Svelvet nodes={initialNodes} edges={initialEdges} background />

正如你所看到的,initialNodesinitialEdges 数组的对象被分别传递给节点和边的道具。Svelvet将根据每个数组中的对象属性值来渲染图形。

上面的代码将把下面的图形渲染到浏览器上:

Input and Default Nodes

这个例子应该能让你了解nodesedges 道具是如何工作的。接下来,我们将看看对象属性如何定义和连接nodesedges 道具。

节点

nodes 道具用于在图中呈现盒状元素,被称为节点。每个节点可能包含一些文字或信息,描述节点代表的内容。

Input Node

nodes 道具需要一个对象数组,对象的属性用于定义每个节点的widthheightposition 、和背景颜色(bgColor )。每个对象代表一个节点,所以如果在一个特定的节点数组中存在五个对象,该组件将向图中呈现五个节点。

下面是一个典型的节点对象。

{
    id: 1,
    position: { x: 350, y: 50 },
    data: { label: 'input Node' },
    width: 175,
    height: 40,
    bgColor: 'white'
}

现在,让我们来看看每个对象的属性,以便更好地了解它们的用途。

id

id 属性是用来给每个节点分配ID的。该属性接收一个整数,作为节点的标识符。在定义边缘属性时,这些整数被用来引用每个节点。

data

data 属性用于标记节点,它接收一个带有'label' 属性的对象,该对象接受一个要在节点上显示的文本或信息的字符串值。

position

position 属性用于在图形上定位一个节点;它接收一个具有x和y属性的对象。这些属性接受整数值,用于在x轴和y轴上对齐节点。

bgColor

bgColor 属性正如其名称所暗示的那样;它被用来改变节点的背景颜色。

widthheight

widthheight 属性用于控制节点的尺寸;它们接受整数值。

边缘

edges 属性用于构建图上节点之间的线。这些线被称为边,它们充当两个节点之间的连接器。

Edge

edges 道具接受一个对象数组,对象的属性被用来引用和连接节点。

const initialEdges = [
    { 
      id: 'e1-2',
      source: 1,
      target: 2,
      type: 'straight',
      label: 'edge'
    },
];

...
 <Svelvet ... edges={initialEdges} .../> 

让我们看一下对象的属性,以更好地理解它们的工作原理。

id

id 属性也作为边的标识符,但与前者不同,它接受字符串值而不是整数。该值描述了被该对象连接的节点。例如,id 值为'e1-2' 的边缘对象将把id1 的节点连接到id2 的另一个节点。

//edge for connecting node 1 and 2
{ id: 'e1-2', ...}

source

source 属性用于设置一个边缘的原点。该属性采用一个整数,引用一个节点的id 值,并将其标记为边缘的源头。

//referencing the node with an id of 1
{ 
  ...,
  source: 1, 
  ...
}

当目标节点被设置后,组件将从源节点开始绘制边缘线。

target

target 属性用于从源头设置边缘的目标。该属性还接收一个整数,该整数引用与源节点不同的id 值。

例如,如果源属性引用的节点的id1 ,那么target 属性将引用另一个节点的id23

//node 1 targeting node 2
{
  ...,
  source: 1,
  target: 2,
  ...
}

Source Target

label

label 属性的作用与节点data 属性类似;它被用来向边缘添加文本或信息。label 被放置在两个连接节点的交叉点上。

{
  ...,
  label: 'label'
}

Source Label Target

animate

animate 属性用于对边缘进行动画处理。它需要一个布尔值,当设置为true 时,它将使边缘动画化,而当设置为false时,它将保持静态。

{
  ... ,
  animate: true
}

Animated Edge

type

type 属性用于设置边缘的外观,它接受一个defaultstraight 的字符串值。default 边缘类型是贝塞尔曲线,而straight 边缘类型是直线。

{
  ... ,
  type: ‘default’
}
//or
{
  ... ,
  type: ‘straight’
} 

Default Straight Edges

arrow

arrow 属性用于配置边缘线的端点;它将边缘转变为指向目标节点的箭头。arrow 属性接受一个布尔值,即truefalse

{
  ... ,
  arrow: true
}

Arrow Edge

noHandle

这个noHandle 属性与arrow 属性类似;它被用来移除指向目标节点的边缘线的手柄。该属性接受一个布尔值,即truefalse

{
  ... ,
  noHandle: true
}

Nohandle Edge

用Svelvet构建流程图

我们已经回顾了Svelvet的核心概念;这些信息足以帮助你开始在Svelvet中绘制图表的旅程。

最后,让我们从头开始建立一个流程图。

第一步,在你的Svelte项目中创建一个新的组件,或者使用App.svelte 主组件。接下来,在脚本部分导入Svelte组件,创建两个对象数组,并根据你的喜好调整属性。

在这个例子中,我们将使用以下内容。

<script>
Import Svelvet from ‘svelvet’

//nodes array
const nodeArr = [
   {
     id: 1,
     position: { x: 300, y: 20 },
     data: { label: "Input Node" },
     width: 175,
     height: 40,
     bgColor: "#127369"
   },
   {
     id: 2,
     position: { x: 80, y: 150 },
     data: { label: "bezier" },
     width: 70,
     height: 40,
     bgColor: "#8AA6A3"
   },
   {
     id: 3,
     position: { x: 282, y: 190 },
     data: { label: "straight" },
     width: 70,
     height: 40,
     bgColor: "#F2BE22"
   },
   {
     id: 4,
     position: { x: 494, y: 150 },
     data: { label: "animated" },
     width: 140,
     height: 40,
     bgColor: "#BFBFBF"
   },
   {
     id: 5,
     position: { x: 120, y: 225 },
     data: { label: "no handle" },
     width: 80,
     height: 40,
     bgColor: "#03A678"
   },
   {
     id: 6,
     position: { x: 390, y: 225 },
     data: { label: "arrow handle" },
     width: 100,
     height: 40,
     bgColor: "#F27405"
   }
 ];

 //edges array
 const edgeArr = [
   {
     id: "e1-2",
     source: 1,
     target: 2,
     type: "bezier",
     label: "default edge"
   },
   {
     id: "e1-3",
     source: 1,
     target: 3,
     type: "straight",
     label: "straight edge"
   },
   {
     id: "e1-4",
     source: 1,
     target: 4,
     type: "bezier",
     animate: true,
     label: "animated edge"
   },
   {
     id: "e1-5",
     source: 1,
     target: 5,
     type: "bezier",
     noHandle: true,
     label: "noHandle edge"
   },
   {
     id: "e1-6",
     source: 1,
     target: 6,
     type: "bezier",
     arrow: true,
     label: "arrow edge"
   }
 ];
</script>

接下来,将Svelvet 组件添加到模板部分,将nodeArr 数组传递给nodes道具,将edgesArr 数组传递给edges 道具,像这样:

<Svelvet nodes={nodeArr} edges={edgeArr} />

现在,保存代码并通过运行以下命令启动开发服务器:

npm run dev

你会注意到,很难察觉到Svelvet渲染器的边界,节点经常会重叠在边界之外。这是由于渲染器默认的白色背景造成的。

为了解决这个问题,使渲染器不那么模糊,你可以给组件添加一个background ,就像这样:

<Svelvet nodes={nodeArr} edges={edgeArr} background />

background 这个道具会给渲染器添加一个点状的背景,这将使我们更容易感知渲染器的大小。

Dotted Background

我们还可以通过给组件添加widthheight 道具来增加渲染器的大小。

<Svelvet nodes={nodeArr} edges={edgeArr} background width={900} height={800} />

Colorful Backgrounds

就这样,我们很快就创建了一个流程图!

Svelvet开箱即是互动的。你和那些观看你的流程图的人,可以在图中选择和移动节点,以及缩放和平移。

Zooming and Panning

结论

在这篇文章中,我们研究了Svelvet的核心概念,研究了节点和边缘对象的属性,并演示了如何使用Svelvet建立一个基本流程图。

Svelvet仍处于起步阶段,缺乏其对应的React flow所提供的一些功能。Svelvet团队承诺在未来将通过整合额外的定制、测试和错误处理功能,使该库更加广泛。

不管怎么说,该库的基本功能已经建立起来了,可以用于生产;你可以在你的项目中使用它。即使没有额外的功能,Svelvet也是在Svelte中构建漂亮流程图的一个直观的解决方案。