LogicFlow自定义节点:矩形、HTML(vue3)

效果:

LogicFlow 内部是基于MVVM模式进行开发的,分别使用preactmobx来处理 view 和 model,所以当我们自定义节点的时候,需要为这个节点定义viewmodel

参考官方文档:节点 | LogicFlow

1、自定义矩形节点

customRect.ts文件:

import { RectNode, RectNodeModel, h } from '@logicflow/core';

class TodoNodeView 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,
      //     y: y - height / 2 - 2,
      //     width: 30,
      //     height: 30,
      //     viewBox: '0 0 1274 1024',
      //   },
      //   h('path', {
      //     fill: '#6f757d',

      //     d: 'M735.483537 563.043418c-127.277094 0-230.472576 103.195482-230.472576 230.484006s103.195482 230.472576 230.472576 230.472576 230.472576-103.195482 230.472576-230.461147-103.184053-230.495435-230.472576-230.495435z m104.555573 333.999509a29.99058 29.99058 0 0 1-42.288546 0l-83.434159-83.434159a29.876286 29.876286 0 0 1-8.686296-22.56151V671.679264a29.922004 29.922004 0 0 1 59.832578 0v108.40726l74.576423 74.656428a29.99058 29.99058 0 0 1 0 42.299975z',
      //     // d:
      //     //   "M655.807326 287.35973m-223.989415 0a218.879 218.879 0 1 0 447.978829 0 218.879 218.879 0 1 0-447.978829 0ZM1039.955839 895.482975c-0.490184-212.177424-172.287821-384.030443-384.148513-384.030443-211.862739 0-383.660376 171.85302-384.15056 384.030443L1039.955839 895.482975z",
      //   }),
      //   h('path', {
      //     fill: '#6f757d',

      //     d: 'M481.992276 793.538853a253.514119 253.514119 0 0 1 144.318236-228.883898q-8.114829-0.377168-16.321093-0.377169h-204.585129c-191.498538 0-347.360404 152.010179-347.360403 338.856977v19.921335c0 99.709534 153.278836 99.709534 347.360403 99.709534h221.729134A253.468402 253.468402 0 0 1 481.992276 793.538853zM490.118535 546.665178c150.707235 0 273.344019-122.648213 273.344018-273.355447S640.848628 0 490.118535 0 216.785945 122.636784 216.785945 273.309731 339.365583 546.665178 490.118535 546.665178z',
      //   }),
      // ),
    ]);
  }
}

class TodoNodeModel extends RectNodeModel {
  getNodeStyle() {
    const style = super.getNodeStyle();
    style.stroke = '#ffffff'; //节点边框颜色
    style.fill = '#ffffff'; //填充色
    return style;
  }
  initNodeData(data) {
    super.initNodeData(data); //调用父类的方法
    this.width = 180;
    this.height = 60;
    this.radius = 10;
  }
}

export default {
  type: 'TodoNode',
  view: TodoNodeView,
  model: TodoNodeModel,
};

2、自定义HTML节点

customHtml.ts文件:

import { HtmlNodeModel, HtmlNode } from '@logicflow/core';
class UmlModel extends HtmlNodeModel {
  setAttributes() {
    // 设置节点宽高和锚点
    const width = 80;
    const height = 88;
    this.width = width;
    this.height = height;
  }
}
class UmlNode extends HtmlNode {
  setHtml(rootEl) {
    const { properties } = this.props.model;
    const node_md = this.props.model;
    const el = document.createElement('div');
    el.className = 'uml-wrapper';
    el.id = node_md.id; // html 节点绑定节点唯一ID;即可通过id 获取对应dom元素 并进行相关业务操作
    const html = `
      <div class="logdom-hml" ></div>
    `;
    el.innerHTML = '我是一个小天才';
    el.style.backgroundColor = 'pink';
    // 需要先把之前渲染的子节点清除掉。
    rootEl.innerHTML = '';
    rootEl.appendChild(el);
  }
}

export default {
  type: 'Htmlnode',
  view: UmlNode,
  model: UmlModel,
};

注册自定义节点

我们可以在创建LogicFlow实例之后,render之前,使用register方法来注册自定义节点。

<template>
  <div class="composer">
    <div class="workflow-app" id="container"></div>
  </div>
</template>
<script setup lang="ts">
  import { onMounted, ref } from 'vue';
  // import { forEach, map, has } from 'lodash-es';
  import LogicFlow from '@logicflow/core';
  import '@logicflow/core/dist/style/index.css';
  import { Control } from '@logicflow/extension';
  import TodoNode from './customRect';
  import Htmlnode from './ProgressNode';

  const lf = ref();
  const render = (data: any) => {
    lf.value.render(data);
  };

  onMounted(() => {
    renderGraphData();
    render({
      nodes: [
        {
          id: '1',
          type: 'TodoNode',
          x: 200,
          y: 200,
          text: '开始',
        },
        {
          id: '2',
          type: 'TodoNode',
          x: 600,
          y: 300,
          text: '流程节点1',
        },
        {
          id: '3',
          type: 'Htmlnode',
          x: 600,
          y: 500,
        },
      ],
      edges: [
        {
          type: 'bezier',
          sourceNodeId: 1,
          targetNodeId: 2,
        },
      ],
    });
  });

  const renderGraphData = () => {
    const container: any = document.querySelector('#container');
    if (container) {
      lf.value = new LogicFlow({
        plugins: [Control],
        background: {
          backgroundColor: '#f5f6f7',
        },
        grid: {
          size: 10,
          type: 'dot',
          config: {
            color: '#DEE0E3',
            thickness: 1,
          },
        },
        keyboard: {
          // 键盘事件开关
          enabled: true,
        },
        // style: {
        //   rect: {
        //     // 矩形节点样式
        //     stroke: '#31A5FF',
        //     strokeWidth: 1,
        //     fill: '#fff',
        //   },
        // },
        container,
      });
      lf.value.register(TodoNode); //注册节点
      lf.value.register(Htmlnode); //注册节点
      // console.log('画布', lf.value.getGraphData()); //打印画布数据
      lf.value.on('node:click', (data: any) => {
        console.log('点击了', data.data.text.value, data);
      });
    }
  };
</script>
<style lang="less" scoped>
  .composer {
    height: 100%;
    width: 100%;

    .workflow-app {
      width: 100%;
      height: 100%;
    }
  }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python卷积神经网络人脸识别示例实现详解

目录 一、准备 1&#xff09;使用pytorch 2&#xff09;安装pytorch 3&#xff09;准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1&#xff09;导入库 2&#xff09;数据预处理 3&#xff09;加载数据 4&#xff09;构建一个卷积神经网络 5&#xff0…

基于Ollama安装deepseek-r1模型搭建本地知识库

大模型 安装Ollama使用win系统安装使用sh脚本安装使用docker安装 下载大模型搭建本地知识库安装Dify对比参数模型 本实验主要使用win系统安装ollama部署deepseek-r1&#xff08;1.5b、7b、8b、14b、32b等参数&#xff09;并搭建本地知识库&#xff08;个人学习研究为主&#xf…

【R语言】t检验

一、基本介绍 t检验&#xff08;t-test&#xff09;是用于比较两个样本均值是否存在显著差异的一种统计方法。 t.test()函数的调用格式&#xff1a; t.test(x, yNULL, alternativec("two.sided", "less", "greater"), mu0, pairFALSE, var.eq…

Uniapp 原生组件层级过高问题及解决方案

文章目录 一、引言&#x1f3c5;二、问题描述&#x1f4cc;三、问题原因❓四、解决方案&#x1f4af;4.1 使用 cover-view 和 cover-image4.2 使用 subNVue 子窗体4.3 动态隐藏原生组件4.4 使用 v-if 或 v-show 控制组件显示4.5 使用 position: fixed 布局 五、总结&#x1f38…

x_xor_md5

x_xor_md5 打开附件&#xff0c;用010打开 发现有一行值是重复的。 根据题目提示我们把全文与重复行进行异或 str1 [0x01,0x78,0x0C,0x4C,0x10,0x9E,0x32,0x37,0x12,0x0C,0xFB,0xBA,0xCB,0x8F,0x6A,0x53]result[]txt [0x69,0x35,0x41,0x01,0x1C,0x9E,0x75,0x78,0x5D,0x48,0xF…

【C语言标准库函数】标准输入输出函数详解[6]:字符文件读取写入

目录 一、字符文件写入函数 1.1. fputc函数 1.1.1. fputc函数简介 1.1.2. 使用场景 1.1.3. 注意事项 1.1.4. 示例 1.2. fputs函数 1.2.1. fputs函数简介 1.2.2. 使用场景 1.2.3. 注意事项 1.2.4. 示例 二、字符文件读取函数 2.1. fgetc函数 2.1.1. 函数简介 2.1…

基于深度学习的半导体故障诊断与寿命预测算法研究

摘要 半导体产业在现代科技领域占据着核心地位&#xff0c;其设备的稳定性和可靠性至关重要。传统的半导体故障诊断和寿命预测方法存在效率低、准确性差等问题。本文聚焦于深度学习算法在半导体故障诊断与寿命预测方面的应用&#xff0c;详细阐述了卷积神经网络&#xff08;CN…

制药行业 BI 可视化数据分析方案

一、行业背景 随着医药行业数字化转型的深入&#xff0c;企业积累了海量的数据&#xff0c;包括销售数据、生产数据、研发数据、市场数据等。如何利用这些数据&#xff0c;挖掘其价值&#xff0c;为企业决策提供支持&#xff0c;成为医药企业面临的重大挑战。在当今竞争激烈的…

基于Python flask-sqlalchemy的SQLServer数据库管理平台

适应场景&#xff1a; 主要用于帮助DBA自动化很多日常工作&#xff0c;包括&#xff1a; 数据库状态监控 性能问题诊断 日志分析 自动巡检 问题告警 系统截图&#xff1a; main.py from flask import Blueprint, render_template, request, flash, redirect, url_for f…

TensorRT 8.6.1教程1-TensorRT简介

区分计算节点和数据节点 视频 TensorRT 教程 | 基于 8.6.1 版本 | 第一部分_哔哩哔哩_bilibili cookbook

MySQL创建存储过程和存储函数

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

【项目总结】易到家家政服务平台 —— 派单调度(7)

派单调度需求分析 在抢单业务中&#xff0c;用户下单成功由服务人员或机构进行抢单&#xff0c;抢单成功服务人员上门服务&#xff0c;除了抢单业务系统还设计了派单业务&#xff0c;由系统根据用户订单的特点自动派给合适的服务人员。 流程如下&#xff1a; 首先获取待分配…

visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决

情况1&#xff1a;提示无法打开 源文件 "string"之类导致无法编译 情况2:能编译&#xff0c;但无法打开这些库文件或标准库使用提示下划红色问题 解决方案&#xff1a; 一、通过工具->选项->跨平台里&#xff0c;在“远程标头IntelliSense管理器”更新下载一下…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…

Eclipse 插件开发相关概念

整理了Eclipse插件开发的概念&#xff0c;用于熟悉入门 SWT&#xff08;Standard Widget Toolkit&#xff09;标准图形工具箱 Java开发的GUI程序技术&#xff0c;由Eclipse开发&#xff0c;相比AWT、Swing更美观&#xff1b;对于目标平台上已经有的控件&#xff0c;SWT会直接使…

算法之 数论

文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义&#xff1a;除了本身和1&#xff0c;不能被其他小于它的数整除&#xff0c;最小的质数是 2 求解质数的几种方法 法1&#xff0c;根…

AndroidStudio查看Sqlite和SharedPreference

1.查看Sqlite 使用App Inspection&#xff0c;这是个好东西 打开方式&#xff1a;View → Tool Windows → App Inspection 界面如图&#xff1a; App inspection不但可以看Sqlite还可以抓包network和background task连抓包工具都省了。 非常好使 2.查看sharedPreference 使…

谈一谈数据库中的死锁问题

文章目录 死锁是什么&#xff1f;死锁的四个必要条件避免死锁的策略 本篇文章是基于《MySQL45讲》来写的个人理解与感悟。 死锁是什么&#xff1f; 死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。若无外力作用&a…

网络工程师 (31)VLAN

前言 VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是一种将物理局域网划分成多个逻辑上独立的虚拟网络的技术。 一、定义与特点 定义&#xff1a;VLAN是对连接到的第二层交换机端口的网络用户的逻辑分段&#xff0c;不受网络用户的物理位置…

从深入理解 netty——》AI

想了很久&#xff0c;准备写一个系列从深入理解 netty——》AI。 先说下为啥要从netty开始&#xff0c;看看netty的重要性 rocketmq异步消息组件nacos微服务注册中心spring cloud gateway网关redission分布式缓存es全文检索sentinel流量控制&#xff0c;服务保护seata分布式…