(Translated by https://www.hiragana.jp/)
zlecheng · GitHub
Skip to content
View zlecheng's full-sized avatar
🌍
🌍

Block or report zlecheng

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Please don't include any personal information such as legal names or email addresses. Maximum 100 characters, markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
zlecheng/README.md

「AntV」X6 てい义vue节点(vue3)

かんかたぶん

ほんへんぶん档只讲解vue3ちゅう如何いか使用しよう,vue2てき参考さんこうかんかたぶん

あんそう插件

@antv/x6-vue-shape

添加てんかvue组件

すんでしか使用しようvue节点,么我们就需要じゅようじゅん备一个vueてき组件,这个组件就是节点てきいち些样しきすえ你们てきuiくだりうつしだい码即

<template>
  <div>节点名称めいしょう</div>
  <div>节点描てんびょうじゅつ</div>
  ……
</template>

ちゅうさつvue节点

  1. 导入vue节点ちゅうさつ插件

import { register, getTeleport } from '@antv/x6-vue-shape';

  1. ちゅうさつ节点
register({
  shape: 'custom-vue-node',
  width: 'auto',
  height: 104,
  component: vueNode // 这个就是你定义的vue组件
});
  1. 添加てんか传送门
import { getTeleport } from '@antv/x6-vue-shape';
const TeleportContainer = defineComponent(getTeleport());

// template ちゅう添加てんか标签,かず你的画布がふ容器ようきひら
<div id="graphDom"></div>
<TeleportContainer />
  1. 使用しよう
  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节点拖拽てき时候报错?

image.png 检查你的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:antvis/X6#4323 (这里めんゆうvue2てきかい决方あん下面かめん这个图片vue2てきかい决方ほうimage.png

场景

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)
      });
    }
  }
});

いたり此,すうすえはんこう传递就完成かんせいりょういたり于怎么使用しよう传递过来てきすうすえ就看你们てき业务需求りょう

vue节点じゅう复渲しみ问题

こんてんざいふう装画そうがぬの节点预览组件てき时候,发现从这个组けんとべ转到编辑页面てき时候,节点じゅう复渲しみりょう,也就ばららいゆう两个节点,现在变成りょう4个节てん原本げんぽん以为わが本地ほんじ缓存,ただし刷新さっしん页面也还かいじゅう复渲しみ……,这就ゆうてん摸不头脑りょう,于是开始しゃ找小伙伴们的帮助,确定りょう问题てき根源こんげんざいTeleportContainerさいきさきしゃてきしょう伙伴也是给了个下めんてきかい决方あん

かい决方あん1

よし于是两个毫不しょう关的ちち页面,而且两个ちち页面使用しようりょうTeleportContainerかい决的方法ほうほう就是如何いかただ保留ほりゅういち个,也就ざいみちよしとべ转的时候携带个参すう过来,告知こくちとうぜんちち页面需要じゅよう删除 TeleportContainer

// ちち页面A
route.push('/fb?delTeleport=true');

// ちち页面B
<TeleportContainer v-if="!delTeleport"/> 

かい决方あん2

推荐だい种写ほう,毕竟见心烦,すんでしかただのう保留ほりゅういちTeleportContainer就把它放ざい所有しょゆう页面てき共同きょうどうちち组件さとめん,也就组件 App.vueさとめん

<template>
    <TeleportContainer />
</template>


import { getTeleport } from '@antv/x6-vue-shape';
// x6てきvue节点すうすえ传送门
const TeleportContainer = defineComponent(getTeleport());

7b49173b21c936862b568f83c1dae9a.jpg

🚀 かんかた链接
✈️ demoたい
🌍 关联文章ぶんしょう

111.webp

Pinned Loading

  1. antv-page antv-page Public

    AntV 踩坑しめせれい

    JavaScript

  2. atlas-pages atlas-pages Public

    关系图谱展示てんじ

    JavaScript

  3. img-tool img-tool Public

    图片批量处理工具こうぐ

    JavaScript

  4. h5-picture-preview. h5-picture-preview. Public

    HTML

  5. vuejs/vitepress vuejs/vitepress Public

    Vite & Vue powered static site generator.

    TypeScript 12.5k 2k