LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event

事件 Event

当我们使用鼠标或其他方式与画布交互时,会触发对应的事件。通过监听这些事件,可以获取其在触发时所产生的数据,根据这些数据来实现需要的功能。详细可监听事件见事件API

监听事件

lf实例上提供on方法支持监听事件。

lf.on("node:dnd-add", (data) => {});

LogicFlow 支持用逗号分割事件名。

lf.on("node:click,edge:click", (data) => {});

自定义事件

除了 lf 上支持的监听事件外,还可以使用eventCenter对象来监听和触发事件。eventCenter是一个graphModel上的一个属性。所以在自定义节点的时候,我们可以使用eventCenter触发自定义事件。

class ButtonNode extends HtmlNode {
  setHtml(rootEl) {
    const { properties } = this.props.model;

    const el = document.createElement("div");
    el.className = "uml-wrapper";
    const html = `
      <div>
        <div class="uml-head">Head</div>
        <div class="uml-body">
          <div><button οnclick="setData()">+</button> ${properties.name}</div>
          <div>${properties.body}</div>
        </div>
        <div class="uml-footer">
          <div>setHead(Head $head)</div>
          <div>setBody(Body $body)</div>
        </div>
      </div>
    `;
    el.innerHTML = html;
    rootEl.innerHTML = "";
    rootEl.appendChild(el);
    window.setData = () => {
      const { graphModel, model } = this.props;
      graphModel.eventCenter.emit("custom:button-click", model);
    };
  }
}

例子:
新建 src/views/Example/LogicFlow/component/CustomNode/index.ts 代码如下:

import { HtmlNode, HtmlNodeModel } from '@logicflow/core'

// 扩展全局 Window 接口
declare global {
  interface Window {
    stopPropagation: (ev: Event) => void
    setDatas: () => void
  }
}

class ButtonNode extends HtmlNode {
  setHtml(rootEl: HTMLElement): void {
    const properties = this.props.model.properties

    const el: HTMLDivElement = document.createElement('div')
    el.className = 'uml-wrapper'
    const html: string = `
      <div>
        <div class="uml-head">Head</div>
        <div class="uml-body">
          <div><button οnclick="setDatas()" οnmοusedοwn="stopPropagation(event)">+</button> ${properties.name}</div>
          <div>${properties.body}</div>
        </div>
        <div class="uml-footer">
          <div>setHead(Head $head)</div>
          <div>setBody(Body $body)</div>
        </div>
      </div>
    `
    el.innerHTML = html
    rootEl.innerHTML = ''
    rootEl.appendChild(el)
    // 实现这些方法
    window.stopPropagation = (ev: Event) => {
      ev.stopPropagation()
    }
    window.setDatas = () => {
      const { graphModel, model } = this.props
      graphModel.eventCenter.emit('custom:button-click', model)
    }
  }
}

class ButtonNodeModel extends HtmlNodeModel {
  setAttributes(): void {
    this.width = 300
    this.height = 150
    this.text.editable = false
  }
}

// TypeScript 中不使用 default export 时,需要显式地声明每个被导出的成员。
export const CustomNode = {
  type: 'CustomNode',
  view: ButtonNode,
  model: ButtonNodeModel
}

新建 src/views/Example/LogicFlow/Example13.vue 代码如下:

<script setup lang="ts">
import LogicFlow from '@logicflow/core'
import '@logicflow/core/dist/style/index.css'
import { CustomNode } from './component/CustomNode'
import { onMounted } from 'vue'

const data = {
 nodes: [
   {
     id: '1',
     type: 'CustomNode',
     x: 300,
     y: 100,
     properties: {
       name: 'hello',
       body: 'world'
     }
   }
 ],
 edges: []
}

// 在组件挂载时执行
onMounted(() => {
 // 创建 LogicFlow 实例
 const lf = new LogicFlow({
   container: document.getElementById('container')!, // 指定容器元素
   grid: true // 启用网格
 })
 lf.register(CustomNode)
 // 渲染图表数据
 lf.render(data)

 lf.on('custom:button-click', (model) => {
   console.log(model.properties)
   switch (model.properties.body) {
     case 'world':
       lf.setProperties(model.id, {
         body: 'LogicFlow'
       })
       break
     default:
       lf.setProperties(model.id, {
         body: 'world'
       })
   }
 })
})
</script>

<template>
 <h3>Example13</h3>
 <div id="container"></div>
 <!-- 用于显示 LogicFlow 图表的容器 -->
</template>

<style>
#container {
 /* 容器宽度 */
 width: 100%;
 /* 容器高度 */
 height: 500px;
}
.uml-wrapper {
 background: #68fce2;
 width: 100%;
 height: 100%;
 border-radius: 10px;
 border: 2px solid #838382;
 box-sizing: border-box;
}
.uml-head {
 text-align: center;
 line-height: 30px;
 font-size: 16px;
 font-weight: bold;
}
.uml-body {
 border-top: 1px solid #838382;
 border-bottom: 1px solid #838382;
 padding: 5px 10px;
 font-size: 12px;
}
.uml-footer {
 padding: 5px 10px;
 font-size: 14px;
}
</style>

效果如下:
在这里插入图片描述


样例代码: GITUHB

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于 jQuery 的事件,我可以和你分享一些学习笔记。 1. 绑定事件 在 jQuery 中,我们可以通过以下方式来绑定事件: ``` $(selector).event(function(){ // 事件处理程序 }) ``` 其中,`selector` 表示要绑定事件的元素,`event` 表示要绑定的事件类型,比如 `click`、`mouseover` 等等。事件处理程序则是在事件触发时要执行的代码块。 2. 多个事件绑定 我们可以通过 `on()` 方法来同时绑定多个事件: ``` $(selector).on({ event1: function(){ // 事件处理程序1 }, event2: function(){ // 事件处理程序2 } }) ``` 这样,当 `event1` 或 `event2` 中任意一个事件触发时,对应的处理程序都会被执行。 3. 解除事件 如果需要解除某个元素的事件处理程序,可以使用 `off()` 方法: ``` $(selector).off(event); ``` 其中,`event` 表示要解除的事件类型。如果不指定事件类型,则会解除该元素上所有的事件处理程序。 4. 事件委托 在 jQuery 中,我们可以使用事件委托来提高性能。事件委托是指将事件绑定到父元素上,而不是绑定到子元素上,然后通过事件冒泡来判断是哪个子元素触发了该事件。这样,当子元素数量较多时,只需要绑定一次事件,就可以监听到所有子元素的事件。 ``` $(selector).on(event, childSelector, function(){ // 事件处理程序 }) ``` 其中,`selector` 表示父元素,`event` 表示要绑定的事件类型,`childSelector` 表示要委托的子元素的选择器,事件处理程序则是在子元素触发事件时要执行的代码块。 以上是 jQuery 中事件的一些基本操作,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stack Stone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值