在使用Ant Design G6图表库时,如何保存拖动后的节点位置

217 阅读3分钟

如何保存拖动后的位置

在使用Ant Design G6图表库时,如何保存拖动后的节点位置。以下是详细步骤:

  1. 监听拖拽事件:您需要监听节点的拖拽事件,特别是node:dragend事件,这个事件在节点拖拽完成时触发。您可以在这个事件中获取节点的新位置。

  2. 更新节点位置:在node:dragend事件的处理函数中,您可以更新节点的位置数据。G6提供了节点模型(model)的fxfy属性来设置节点的位置。

  3. 保存位置数据:更新节点位置后,您需要将这些数据保存起来,可以是保存到本地存储、数据库或者任何其他您用于存储数据的地方。

以下是一个具体的代码示例,展示了如何实现这一功能:

import G6 from '@antv/g6';

const graph = new G6.Graph({
  container: 'container',
  width: 800,
  height: 600,
  modes: {
    default: ['drag-canvas', 'zoom-canvas', 'drag-node'],
  },
  // ...其他配置...
});

// 当节点在拖动过程中时触发的事件,此事件作用于被拖拽节点上
graph.on("node:drag", function (e) {
  const model = e.item.get("model");
  model.fx = e.x;
  model.fy = e.y;
});

// 当拖拽完成后触发的事件,此事件作用在被拖曳节点上
graph.on("node:dragend", function (e) {
  const model = e.item.get("model");
  // 这里可以保存节点的新位置,例如保存到本地存储或数据库
  saveNodePosition(model.id, model.fx, model.fy);
});

function saveNodePosition(nodeId, x, y) {
  // 这里只是一个示例,您可以根据需要保存到不同的地方
  localStorage.setItem(nodeId, JSON.stringify({ x, y }));
}

在这个示例中,当节点被拖动时,node:drag事件会更新节点的fxfy属性,而在node:dragend事件中,您可以调用saveNodePosition函数来保存节点的新位置。这里简单地将位置保存到了本地存储中,您可以根据实际需求保存到更合适的地方。

如何展示上次保存的位置

要在下次打开界面时展示上次保存的位置,需要在图表初始化时读取保存的位置数据,并应用这些数据到节点的位置上。以下是实现这一功能的步骤:

  1. 读取位置数据:在图表初始化之前,从您保存位置数据的地方(如本地存储、数据库等)读取节点的位置数据。

  2. 应用位置数据:在创建图表或加载数据时,将读取的位置数据应用到相应的节点上。

  3. 初始化图表:使用更新后的数据初始化图表。

以下是一个具体的代码示例,展示了如何实现这一功能:

import G6 from '@antv/g6';

// 假设您保存位置数据的函数是saveNodePosition
// 这里是一个读取位置数据的函数
function getNodePosition(nodeId) {
  // 从本地存储或其他存储中读取位置数据
  const position = localStorage.getItem(nodeId);
  return position ? JSON.parse(position) : null;
}

// 初始化图表
const graph = new G6.Graph({
  container: 'container',
  width: 800,
  height: 600,
  modes: {
    default: ['drag-canvas', 'zoom-canvas', 'drag-node'],
  },
  // ...其他配置...
});

// 假设这是您的节点数据
const data = {
  nodes: [
    { id: 'node1', label: 'Node 1' },
    { id: 'node2', label: 'Node 2' },
    // ...其他节点...
  ],
  edges: [
    // ...边数据...
  ],
};

// 在设置数据之前,更新节点位置
data.nodes.forEach(node => {
  const position = getNodePosition(node.id);
  if (position) {
    node.x = position.x;
    node.y = position.y;
  }
});

graph.data(data);
graph.render();

// 监听拖拽结束事件,保存新的位置
graph.on("node:dragend", function (e) {
  const model = e.item.get("model");
  saveNodePosition(model.id, model.x, model.y);
});

在这个示例中,getNodePosition函数用于从本地存储中读取节点的位置数据。在图表初始化之前,我们遍历节点数据,使用getNodePosition函数更新每个节点的位置。然后,使用更新后的数据初始化图表。这样,当用户下次打开界面时,图表会展示上次保存的节点位置。

请确保在实际应用中,您的保存和读取位置数据的逻辑与您的存储解决方案相匹配。如果您使用的是数据库或其他存储方式,您需要相应地调整saveNodePositiongetNodePosition函数。