AntV X6开发实践:踩过的坑与解决方案
扫描二维码随身看资讯
使用手机 二维码应用 扫描右侧二维码,您可以
1. 在手机上细细品读~
2. 分享给您的微信好友或朋友圈~
在本文中,我们将深入探讨AntV X6中使用Vue3的开发实践,以及在开发过程中遇到的问题和相应的解决方案。我们将详细介绍如何安装插件、添加Vue组件、注册Vue节点、节点内部监听数据变化、处理节点事件和Vue节点内的点击事件冲突问题,以及Vue节点数据如何反向传递给父组件的解决方案。
以下是一些具体的操作步骤和解决方案:
本篇文档只讲解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开发实践:踩过的坑与解决方案
- 挨饿荒野物资不减反增版 v2.3.3 安卓版
- 地铁跑酷洛阳版本下载 v5.03.0 安卓版
- 幻想大乱斗正版
- Agent A伪装游戏中文版下载 v5.2.5 安卓版
- 聚爆Implosion无限徽章版下载 v1.5.14 最新版
- 割绳子1中文版下载 v3.64.0 安卓版
- 最后的邻居
- 假面骑士Ride Kamens
- 深岩银河幸存者
- 魔法猫大冒险
- 模拟建造4安卓版
- 逃离本杰明的房间
- 蛋仔滑滑
- 植物大战僵尸杂交版 安卓正版
- 美团一面:什么是CAS?有什么优缺点?我说我只用过AtomicInteger。。。。
- ReZero AP功能介绍
- 熊猫吃短信:如何增加关键词?
- C#.Net筑基-深入解密小数内部存储的秘密
- OpenTelemetry 简介及在.NET中使用OpenTelemetry logs对接Seq的示例
- 调用PLL-IP核,实现四路不同时钟信号输出
- JetBrains发布Aqua,针对自动化测试的全新IDE
- PyInstaller打包工具反编译教程
- FaceRecognitionDotNet: 跨平台人脸识别库的介绍
- 安卓开发日志采集和分析面面谈
- [机器学习] 低代码机器学习工具PyCaret库使用指北
- 软件崩溃分析与解决
- 1
加查之花 正版
- 2
爪女孩 最新版
- 3
企鹅岛 官方正版中文版
- 4
捕鱼大世界 无限金币版
- 5
情商天花板 2024最新版
- 6
内蒙打大a真人版
- 7
球球英雄 手游
- 8
烦人的村民 手机版
- 9
跳跃之王手游
- 10
蛋仔派对 国服版本