{"expireTime":9007200828528711000,"key":"transformer-remark-markdown-html-3707292c8fb7991d858a1f60d008ca5d-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":"<p>G6 封装了一系列交互方法，方便用户直接使用。本文将为 <strong>Tutorial案例</strong> 增加简单的交互：hover 节点、点击节点、点击边、放缩画布、拖拽画布。本节目标效果如下：<br /><img src=\"https://cdn.nlark.com/yuque/0/2019/gif/156681/1569834387680-016c4436-88d6-4438-aec9-320c8cafc066.gif#align=left&#x26;display=inline&#x26;height=284&#x26;name=tutorial-demo-interact.gif&#x26;originHeight=438&#x26;originWidth=604&#x26;search=&#x26;size=514232&#x26;status=done&#x26;width=392\" alt=\"tutorial-demo-interact.gif\"></p>\n<div style=\"text-align: center;\"> 图1 Tutorial案例的交互效果。</div>\n<h2 id=\"基本概念\"><a href=\"#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5\" aria-label=\"基本概念 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>基本概念</h2>\n<h3 id=\"交互行为-behavior\"><a href=\"#%E4%BA%A4%E4%BA%92%E8%A1%8C%E4%B8%BA-behavior\" aria-label=\"交互行为 behavior permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>交互行为 Behavior</h3>\n<p>G6 中的交互行为。G6 <strong>内置</strong>了一系列交互行为，用户可以直接使用。简单地理解，就是可以一键开启这些交互行为：</p>\n<ul>\n<li><code class=\"language-text\">drag-canvas</code>：拖拽画布；</li>\n<li><code class=\"language-text\">zoom-canvas</code>：缩放画布；</li>\n<li>... 更多详见：<a href=\"../middle/states/defaultBehavior\">交互行为 Behavior</a></li>\n</ul>\n<p>如果内置行为不满足需求，G6 还允许用户进行<strong>自定义交互行为</strong>。由于自定义交互较为复杂，入门教程中不再赘述，如有需求请参见：<a href=\"../advanced/custom-behavior\">自定义交互行为 Behavior</a></p>\n<h3 id=\"交互管理-mode\"><a href=\"#%E4%BA%A4%E4%BA%92%E7%AE%A1%E7%90%86-mode\" aria-label=\"交互管理 mode permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>交互管理 mode</h3>\n<p>mode 是 G6 交互行为的管理机制，一个 mode 是多种行为 Behavior 的组合，允许用户通过切换不同的模式进行交互行为的管理。由于该概念较为复杂，在本入门教程中，读者不需要对该机制深入理解。如有需求，参见 <a href=\"../middle/states/mode\">G6 中的 mode</a>。</p>\n<h3 id=\"交互状态-state\"><a href=\"#%E4%BA%A4%E4%BA%92%E7%8A%B6%E6%80%81-state\" aria-label=\"交互状态 state permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>交互状态 State</h3>\n<p><a href=\"../middle/states/state\">状态 State</a> 是 G6 中的状态机制。用户可以为图中的元素（节点/边）设置不同的状态及不同状态下的样式。在状态发生变化时，G6 自动更新元素的样式。例如，可以为节点设置状态 <code class=\"language-text\">&#39;click&#39;</code> 为 <code class=\"language-text\">true</code> 或 <code class=\"language-text\">false</code>，并为节点设置 <code class=\"language-text\">&#39;click&#39;</code> 的样式为加粗节点边框。当 <code class=\"language-text\">&#39;click&#39;</code> 状态被切换为 <code class=\"language-text\">true</code> 时，节点的边框将会被加粗，<code class=\"language-text\">&#39;click&#39;</code> 状态被切换为 <code class=\"language-text\">false</code> 时，节点的样式恢复到默认。在下面的使用方法中，将会有具体例子。</p>\n<h2 id=\"使用方法\"><a href=\"#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95\" aria-label=\"使用方法 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>使用方法</h2>\n<h3 id=\"拖拽、缩放内置的交互行为\"><a href=\"#%E6%8B%96%E6%8B%BD%E3%80%81%E7%BC%A9%E6%94%BE%E5%86%85%E7%BD%AE%E7%9A%84%E4%BA%A4%E4%BA%92%E8%A1%8C%E4%B8%BA\" aria-label=\"拖拽、缩放内置的交互行为 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>拖拽、缩放——内置的交互行为</h3>\n<p>在 G6 中使用内置 behavior 的方式非常简单，只需要在图实例化时配置 <code class=\"language-text\">modes</code>。拖拽和缩放属于 G6 内置交互行为，修改代码如下：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> graph <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">G6<span class=\"token punctuation\">.</span>Graph</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token operator\">...</span>                                          <span class=\"token comment\">// 其他配置项</span>\n  modes<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">default</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">'drag-canvas'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'zoom-canvas'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'drag-node'</span> <span class=\"token punctuation\">]</span>  <span class=\"token comment\">// 允许拖拽画布、放缩画布、拖拽节点</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>除了直接使用内置交互名称外，也可以为 behavior 配置参数，例如放缩画布的敏感度、最大/最小放缩程度等。高阶用法参见 <a href=\"../middle/states/defaultBehavior\">内置的交互 Behavior</a>。</p>\n<p>上面代码中的 <code class=\"language-text\">modes</code> 定义了 G6 的模式，<code class=\"language-text\">default</code> 是默认的模式，还可以允许有其他的模式，比如：编辑模式 <code class=\"language-text\">edit</code> 等。不同的模式，用户能进行的行为可以不同，比如默认模式能拖拽画布，编辑模式不允许拖拽画布：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 举例解释不同模式</span>\nmodes<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">default</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'drag-canvas'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  edit<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<blockquote>\n<p>更多关于模式、行为可以参考: [TODO: 链接]</p>\n</blockquote>\n<h3 id=\"hover、click-改变样式状态式交互\"><a href=\"#hover%E3%80%81click-%E6%94%B9%E5%8F%98%E6%A0%B7%E5%BC%8F%E7%8A%B6%E6%80%81%E5%BC%8F%E4%BA%A4%E4%BA%92\" aria-label=\"hover、click 改变样式状态式交互 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hover、Click 改变样式——状态式交互</h3>\n<p>有时我们希望通过交互可以将元素样式变成特定样式，如我们看到的图 1 中，鼠标 hover 节点、点击节点、点击边时，样式发生了变化。这里涉及到了 G6 中 <a href=\"../middle/states/state\">状态 State</a> 的概念。简单地说，是否 <code class=\"language-text\">hover</code> 、<code class=\"language-text\">click</code> 、任何操作（可以是自己起的状态名），都可以称为一种状态（state）。用户可以自由设置不同状态下的元素样式。要达到交互更改元素样式，需要两步：</p>\n<ul>\n<li>Step 1: 设置各状态下的元素样式；</li>\n<li>Step 2: 监听事件并切换元素状态</li>\n</ul>\n<h4 id=\"设置各状态下的元素样式\"><a href=\"#%E8%AE%BE%E7%BD%AE%E5%90%84%E7%8A%B6%E6%80%81%E4%B8%8B%E7%9A%84%E5%85%83%E7%B4%A0%E6%A0%B7%E5%BC%8F\" aria-label=\"设置各状态下的元素样式 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>设置各状态下的元素样式</h4>\n<p>在实例化图时，通过 <code class=\"language-text\">nodeStateStyles</code> 和 <code class=\"language-text\">edgeStateStyles</code> 两个配置项可以配置元素在不同状态下的样式。<br />为达到 <strong>Tutorial案例</strong> 中的效果：</p>\n<ul>\n<li>鼠标 hover 节点时，该节点颜色变浅；</li>\n<li>点击节点时，该节点边框加粗变黑；</li>\n<li>点击边时，该边变成蓝色。</li>\n</ul>\n<p>下面代码设置了节点分别在 <code class=\"language-text\">hover</code> 和 <code class=\"language-text\">click</code> 状态为 <code class=\"language-text\">true</code> 时的样式，边在 <code class=\"language-text\">click</code> 状态为 <code class=\"language-text\">true</code> 时的样式：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> graph <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">G6<span class=\"token punctuation\">.</span>Graph</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...                           // 其他配置项</span>\n  <span class=\"token comment\">// 节点不同状态下的样式集合</span>\n  nodeStateStyles<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 鼠标 hover 上节点，即 hover 状态为 true 时的样式</span>\n    hover<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      fill<span class=\"token punctuation\">:</span> <span class=\"token string\">'lightsteelblue'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token comment\">// 鼠标点击节点，即 click 状态为 true 时的样式</span>\n    click<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      stroke<span class=\"token punctuation\">:</span> <span class=\"token string\">'#000'</span><span class=\"token punctuation\">,</span>\n      lineWidth<span class=\"token punctuation\">:</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\">// 节点不同状态下的样式集合</span>\n  edgeStateStyles<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 鼠标点击边，即 click 状态为 true 时的样式</span>\n    click<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      stroke<span class=\"token punctuation\">:</span> <span class=\"token string\">'steelblue'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre></div>\n<h4 id=\"监听事件并切换元素状态\"><a href=\"#%E7%9B%91%E5%90%AC%E4%BA%8B%E4%BB%B6%E5%B9%B6%E5%88%87%E6%8D%A2%E5%85%83%E7%B4%A0%E7%8A%B6%E6%80%81\" aria-label=\"监听事件并切换元素状态 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>监听事件并切换元素状态</h4>\n<p>G6 中所有元素监听都挂载在图实例上，如下代码中的 <code class=\"language-text\">graph</code> 对象是 G6.Graph 的实例，<code class=\"language-text\">graph.on()</code> 函数监听了某元素类型（<code class=\"language-text\">node</code> / <code class=\"language-text\">edge</code>）的某种事件（<code class=\"language-text\">click</code> / <code class=\"language-text\">mouseenter</code> / <code class=\"language-text\">mouseleave</code> / ... 所有事件参见：<a href=\"../../api/Event\">Event API</a>）。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 在图实例 graph 上监听</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'元素类型:事件名'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// do something</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre></div>\n<p>现在，我们通过下面代码，为 <strong>Tutorial案例</strong> 增加点和边上的监听事件，并在监听函数里使用 <code class=\"language-text\">graph.setItemState()</code> 改变元素的状态：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 鼠标进入节点</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:mouseenter'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> nodeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// 获取鼠标进入的节点元素对象</span>\n  graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>nodeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'hover'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// 设置当前节点的 hover 状态为 true</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 鼠标离开节点</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:mouseleave'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> nodeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// 获取鼠标离开的节点元素对象</span>\n  graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>nodeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'hover'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 设置当前节点的 hover 状态为 false</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 点击节点</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:click'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 先将所有当前是 click 状态的节点置为非 click 状态</span>\n  <span class=\"token keyword\">const</span> clickNodes <span class=\"token operator\">=</span> graph<span class=\"token punctuation\">.</span><span class=\"token function\">findAllByState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  clickNodes<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cn</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>cn<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> nodeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// 获取被点击的节点元素对象</span>\n  graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>nodeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 设置当前节点的 click 状态为 true</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 点击边</span>\ngraph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'edge:click'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 先将所有当前是 click 状态的边置为非 click 状态</span>\n  <span class=\"token keyword\">const</span> clickEdges <span class=\"token operator\">=</span> graph<span class=\"token punctuation\">.</span><span class=\"token function\">findAllByState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'edge'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    clickEdges<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ce</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>ce<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> edgeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// 获取被点击的边元素对象</span>\n    graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>edgeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 设置当前边的 click 状态为 true</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"完整代码\"><a href=\"#%E5%AE%8C%E6%95%B4%E4%BB%A3%E7%A0%81\" aria-label=\"完整代码 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>完整代码</h2>\n<p>至此，完整代码如下：</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token doctype\">&lt;!DOCTYPE html></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>en<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>UTF-8<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">></span></span>Tutorial Demo<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>mountNode<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>https://gw.alipayobjects.com/os/antv/pkg/_antv.g6-3.1.0/build/g6.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n    <span class=\"token keyword\">const</span> graph <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">G6<span class=\"token punctuation\">.</span>Graph</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      container<span class=\"token punctuation\">:</span> <span class=\"token string\">'mountNode'</span><span class=\"token punctuation\">,</span>\n      width<span class=\"token punctuation\">:</span> <span class=\"token number\">800</span><span class=\"token punctuation\">,</span>\n      height<span class=\"token punctuation\">:</span> <span class=\"token number\">600</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// 节点默认配置</span>\n      defaultNode<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        labelCfg<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n          style<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            fill<span class=\"token punctuation\">:</span> <span class=\"token string\">'#fff'</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// 边默认配置</span>\n      defaultEdge<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        labelCfg<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n          autoRotate<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// 节点在各状态下的样式</span>\n      nodeStateStyles<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// hover 状态为 true 时的样式</span>\n        hover<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n          fill<span class=\"token punctuation\">:</span> <span class=\"token string\">'lightsteelblue'</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token comment\">// click 状态为 true 时的样式</span>\n        click<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n          stroke<span class=\"token punctuation\">:</span> <span class=\"token string\">'#000'</span><span class=\"token punctuation\">,</span>\n          lineWidth<span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// 边在各状态下的样式</span>\n      edgeStateStyles<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// click 状态为 true 时的样式</span>\n        click<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n          stroke<span class=\"token punctuation\">:</span> <span class=\"token string\">'steelblue'</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// 布局</span>\n      layout<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        type<span class=\"token punctuation\">:</span> <span class=\"token string\">'force'</span><span class=\"token punctuation\">,</span>\n        linkDistance<span class=\"token punctuation\">:</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span>\n        preventOverlap<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n        nodeStrength<span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">30</span><span class=\"token punctuation\">,</span>\n        edgeStrength<span class=\"token punctuation\">:</span> <span class=\"token number\">0.1</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token comment\">// 内置交互</span>\n      modes<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">default</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">'drag-canvas'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'zoom-canvas'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'drag-node'</span> <span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">main</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>\n        <span class=\"token string\">'https://gw.alipayobjects.com/os/basement_prod/6cae02ab-4c29-44b2-b1fd-4005688febcb.json'</span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">const</span> remoteData <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      \n      <span class=\"token keyword\">const</span> nodes <span class=\"token operator\">=</span> remoteData<span class=\"token punctuation\">.</span>nodes<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">const</span> edges <span class=\"token operator\">=</span> remoteData<span class=\"token punctuation\">.</span>edges<span class=\"token punctuation\">;</span>\n      nodes<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>node<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          node<span class=\"token punctuation\">.</span>style <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        node<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>lineWidth <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        node<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>stroke <span class=\"token operator\">=</span> <span class=\"token string\">'#666'</span><span class=\"token punctuation\">;</span>\n        node<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>fill <span class=\"token operator\">=</span> <span class=\"token string\">'steelblue'</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>class<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">'c0'</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            node<span class=\"token punctuation\">.</span>shape <span class=\"token operator\">=</span> <span class=\"token string\">'circle'</span><span class=\"token punctuation\">;</span>\n            node<span class=\"token punctuation\">.</span>size <span class=\"token operator\">=</span> <span class=\"token number\">30</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">'c1'</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            node<span class=\"token punctuation\">.</span>shape <span class=\"token operator\">=</span> <span class=\"token string\">'rect'</span><span class=\"token punctuation\">;</span>\n            node<span class=\"token punctuation\">.</span>size <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n          <span class=\"token keyword\">case</span> <span class=\"token string\">'c2'</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            node<span class=\"token punctuation\">.</span>shape <span class=\"token operator\">=</span> <span class=\"token string\">'ellipse'</span><span class=\"token punctuation\">;</span>\n            node<span class=\"token punctuation\">.</span>size <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span> <span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      edges<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">edge</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>edge<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          edge<span class=\"token punctuation\">.</span>style <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        edge<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>lineWidth <span class=\"token operator\">=</span> edge<span class=\"token punctuation\">.</span>weight<span class=\"token punctuation\">;</span>\n        edge<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>opacity <span class=\"token operator\">=</span> <span class=\"token number\">0.6</span><span class=\"token punctuation\">;</span>\n        edge<span class=\"token punctuation\">.</span>style<span class=\"token punctuation\">.</span>stroke <span class=\"token operator\">=</span> <span class=\"token string\">'grey'</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">data</span><span class=\"token punctuation\">(</span>remoteData<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// 监听鼠标进入节点</span>\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:mouseenter'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> nodeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// 设置目标节点的 hover 状态 为 true</span>\n        graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>nodeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'hover'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// 监听鼠标离开节点</span>\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:mouseleave'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">const</span> nodeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// 设置目标节点的 hover 状态 false</span>\n        graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>nodeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'hover'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// 监听鼠标点击节点</span>\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node:click'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 先将所有当前有 click 状态的节点的 click 状态置为 false</span>\n        <span class=\"token keyword\">const</span> clickNodes <span class=\"token operator\">=</span> graph<span class=\"token punctuation\">.</span><span class=\"token function\">findAllByState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'node'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        clickNodes<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">cn</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>cn<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">const</span> nodeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// 设置目标节点的 click 状态 为 true</span>\n        graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>nodeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// 监听鼠标点击节点</span>\n      graph<span class=\"token punctuation\">.</span><span class=\"token function\">on</span><span class=\"token punctuation\">(</span><span class=\"token string\">'edge:click'</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 先将所有当前有 click 状态的边的 click 状态置为 false</span>\n        <span class=\"token keyword\">const</span> clickEdges <span class=\"token operator\">=</span> graph<span class=\"token punctuation\">.</span><span class=\"token function\">findAllByState</span><span class=\"token punctuation\">(</span><span class=\"token string\">'edge'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        clickEdges<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ce</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>ce<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">const</span> edgeItem <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>item<span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">// 设置目标边的 click 状态 为 true</span>\n        graph<span class=\"token punctuation\">.</span><span class=\"token function\">setItemState</span><span class=\"token punctuation\">(</span>edgeItem<span class=\"token punctuation\">,</span> <span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p> 注意 <br />若需更换数据，请替换 <code class=\"language-text\">&#39;https://gw.alipayobjects.com/os/basement_prod/6cae02ab-4c29-44b2-b1fd-4005688febcb.json&#39;</code> 为新的数据文件地址。</p>"}