「AntV」X6 自定义vue节点(vue3)
本篇文档只讲解vue3中如何使用,vue2的可以参考下官方文档
安装插件
@antv/x6-vue-shape
添加vue组件
既然使用vue节点,那么我们就需要准备一个vue的组件,这个组件就是节点的一些样式,根据你们的ui自行写代码即可
<template>
<div>节点名称</div>
<div>节点描述</div>
……
</template>
注册vue节点
- 导入vue节点注册插件
import { register, getTeleport } from '@antv/x6-vue-shape';
- 注册节点
register({
shape: 'custom-vue-node',
width: 'auto',
height: 104,
component: vueNode // 这个就是你定义的vue组件
});
- 添加传送门
import { getTeleport } from '@antv/x6-vue-shape';
const TeleportContainer = defineComponent(getTeleport());
// template 中添加标签,和你的画布容器平级
<div id="graphDom"></div>
<TeleportContainer />
- 使用
const node = graph.createNode({
shape: 'custom-vue-node',
width: 100,
height: 104,
label: data?.name,
id: data?.id,
// 所有节点的数据源头都在这里设置,需要哪些字段自行添加即可
data: {
name: data?.name, // 节点的名称
img: data?.img || remoteImgUrl.value, // 图标
desc: data?.dataNum || 0, // 总数据描述
……
},
/**
* 连接桩位置判断逻辑
* 1、数据源类型的连接桩只显示右侧
* 2、算子类型的连接桩显示左右两侧
* 3、算子类型-关联回填的连接桩显示左侧
*/
ports: {
...port
}
});
节点内部监听数据变化
const getNodeData = inject('getNode');
onMounted(() => {
const currentNode = getNodeData();
// 监听当前节点数据发生了变化
currentNode.on('change:data', ({ current }) => {
console.log('节点数据是否发生变化了 >>>', current);
});
})
vue节点拖拽的时候报错?
检查你的vue组件是否是这种结构
<template>
<div>内容:{{ dataNode.name }}</div>
<n-badge>
<n-avatar :src="vueIco"></n-avatar>
</n-badge>
</template>
需要改成下面这种的结构(需要用根节点进行包裹)
<div>
<div>内容:{{ dataNode.name }}</div>
<n-badge>
<n-avatar :src="vueIco"></n-avatar>
</n-badge>
</div>
节点事件和vue节点内的click事件冲突问题
场景
因为我用的是vue类型的节点,所以这里就按照vue节点来进行讲解,其它的节点(React、Angular、Html)这些都是通用的。
在vue节点内部的某个元素上需要执行一个点击事件,但是在执行本事件的时候不能去触发
node:click的事件、在执行node:click事件的时候不能触发vue节点的点击事件,也就是两边的事件都是独立的,谁也不能影响谁,而且vue节点内的点击事件在点击的时候还得获取当前节点信息
踩坑方案1
直接给vue的点击事件添加stop修饰符,阻止事件传递,然后在node:click的时候再阻止下,但是结果下来确是不行……
// vue节点的事件
@click.stop = test
// 父页面的节点节点事件
graph.on('node:click',{e} => {
e.stopPropagation()
})
踩坑方案2
采用群里小伙伴的方案,阻止节点鼠标按下或者鼠标抬起的事件,这样可以实现在点击vue节点的时候不触发节点本身的node:click事件,虽然可以实现阻止的功能,但是不好操作节点的数据,我是需要获取当前节点的数据的
终极解决方案
通过获取click事件的点击区域进行判断,如果是点击了vue节点内的点击事件区域,就直接在node:click的时候阻止掉就行了
graph.on('node:click',{e} => {
// 判断target的className或者id,或者你定义的一些自定义属性,
// 反正只要你能知道当前点击的区域是属于谁的就行
// 我在vue节点点击事件的标签上加了个class
if(e.target.className == 'cu-class') return
})
vue节点数据如何反向传递给父组件(vue3)?
提的issues:https://github.com/antvis/X6/issues/4323 (这里面有vue2的解决方案)
这个问题还待解决,官方暂时没有任何答复,短期内只能根据我的业务需求用野路子实现,如果有其它的可以留言你的需求
场景
vue节点内部有一个复选框,用于勾选节点,选中后要给当前节点添加一个是否选中的属性,由于节点的数据更新只能在父页面进行更新,所以必须得把复选框绑定的值传递给父页面
解决方案1
这个方案属于野路子,不是很灵活,如果不是复选框那基本凉凉了
// vue节点内正常写复选框绑定的逻辑
const checked2 = ref(false);
<el-checkbox v-model="checked2" size="large" @change="checkChange"></el-checkbox>
// 父组件监听节点的点击事件
graph.on('node:click',({e,node}) => {
let state = node.data.checkState ?? false;
// 这个判断是为了解决复选框的点击事件和节点的点击事件冲突的问题
if (e.target.className == 'el-checkbox__inner') {
// 给节点添加一个checkState属性,标识是否选中
node.updateData({ checkState: !state }, { ignoreHistory: true });
return;
}
})
// 最后点击保存按钮的时候获取下节点checkState为true的数据
const save = () => {
const allNodes = graph.getNodes();
// 我这里是取的id属性,如果你们需要其它的可以自行组装
checkedOps.value = allNodes.filter(item => item.data.checkState).map(item => item.id);
console.log('checkedOps >>>', checkedOps.value);
}
解决方案2
这个方案就可以随便玩了,不再局限于我自己的需求,如果还要在节点上加其它的控件都可以完美的把数据传递到父组件,其灵感来源于github的小伙伴qw123gz,问官方交流群的群主,问了半天也没有给出方案……
子组件添加emit事件
<el-checkbox v-model="checked2" size="large" @change="checkChange"></el-checkbox>
const checked2 = ref(false);
const emits = defineEmits(['getCheckVal']);
const checkChange = val => {
emits('getCheckVal', val);
};
父组件改造注册vue节点的代码
register({
shape: 'custom-vue-node',
width: 'auto',
height: 104,
// component: vueNode 这个是官方提供的注册方式
component: {
// 使用vue3的render渲染组件,并添加自定义事件
render() {
return h(vueNode, {
// 事件名称前面必须添加 `on`
onGetCheckVal: val => getMyCheckVal(val)
});
}
}
});
至此,数据反向传递就完成了,至于怎么使用传递过来的数据就看你们的业务需求了
「AntV」X6 自定义vue节点(vue3)的更多相关文章
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- 一个「学渣」从零开始的Web前端自学之路
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...
- 「 深入浅出 」集合Map
系列文章: 「 深入浅出 」java集合Collection和Map 「 深入浅出 」集合List 「 深入浅出 」集合Set 前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍M ...
- 「 深入浅出 」集合Set
系列文章 「 深入浅出 」集合List 「 深入浅出 」java集合Collection和Map Set继承自Collection接口,不能包含有重复元素.本篇文章主要讲Set中三个比较重要的实现类: ...
- 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 一个只需要点 「下一步」就完成监控 Windows
Cloud Insight 此前已然支持 Linux 操作系统,支持20多中数据库中间件等组件,多种操作,多种搭配,服务器监控玩的其乐无穷啊!但想想还有许多 Windows 的小伙伴没有体验过,所以在 ...
- 「插件」Runner更新Pro版,帮助设计师远离996
三年多前Runner团队在德国汉堡的骇客松上第一次发布了Sketch插件Runner的beta版本.从那以后,这个团队的目标一直很清晰: 创造一个加速设计工作流的工具. 他们只给Runner添加真正能 ...
随机推荐
- Canvas图形编辑器-数据结构与History(undo/redo)
Canvas图形编辑器-数据结构与History(undo/redo) 这是作为 社区老给我推Canvas,于是我也学习Canvas做了个简历编辑器 的后续内容,主要是介绍了对数据结构的设计以及His ...
- python实现:有一个列表为num_list,找到一个具有最大和的连续子列表,返回其最大和。
# 有一个列表为num_list,找到一个具有最大和的连续子列表,返回其最大和.# 示例:# 输入: [-3,1,-1,6,-1,2,4,-5,4]# 输出: 11# 解释: 连续子数组 [6,-1, ...
- JWT对SpringCloud进行认证和鉴权
JWT(JSON WEB TOKEN)是基于RFC 7519标准定义的一种可以安全传输的小巧和自包含的JSON对象.由于数据是使用数字签名的,所以是可信任的和安全的.JWT可以使用HMAC算法对sec ...
- Koordinator 0.6:企业级容器调度系统解决方案,引入 CPU 精细编排、资源预留与全新的重调度框架
简介: 经过社区多位成员的贡献,Koordinator 0.6 版本正式发布.相较于上一个版本 0.5,新版本进一步完善了 CPU 精细化编排能力,更好的兼容原生用法:支持了资源预留的能力(Reser ...
- 行业实战 | 5G+边缘计算+“自由视角” 让体育赛事更畅快
简介: 世界本是多维的.进入5G时代,观众对多维度视觉体验的需求日益增长,5G MEC网络与边缘计算的结合,具备大带宽.低延迟特性,使视频多维视觉呈现成为现实.在第二十三届CUBA中国大学生篮球联赛期 ...
- 龙蜥社区成立系统运维SIG,重磅开源sysAK系统运维工具集
简介:系统运维SIG致力于打造一个集主机管理.配置部署.监控报警.异常诊断.安全审计等一系列功能的自动化运维平台. OpenAnolis 龙蜥社区(以下简称"龙蜥社区")正式成 ...
- [Caddy2] Caddyfile 使用其它 DNS provider
安装 caddy 的 dns provider 模块. https://github.com/caddy-dns/cloudflare 如果是在 Docker 中 build 模块按文档进行,通过 c ...
- containerd基本使用命令
一.containerd简介 官 方 文 档 : https://containerd.io 在 2016 年 12 月 14 日,Docker 公司宣布将containerd 从 Docker 中分 ...
- CMDB开发(一)
一.CMDB前戏 # 项目开发流程 1.需求分析 产品经理 开发人员 客户等三方会议 2.架构设计 框架的选择 语言选择 数据库选择 3.分组开发 小组成员各自开发各自的功能(可能也会有交集) 4. ...
- 一键启动的AI离线知识库,无需复杂环境依赖,小白都能上手了
简介 在人工智能技术飞速发展的今天,我们经常面临一个挑战:如何快速.简便地部署和使用AI技术?AntSK项目,一个开源的AI知识库和智能体,就是为了解决这一问题而诞生的.现在,我们自豪地宣布,AntS ...