vis.jsを触ってみた。そしてノードの名前を変更してみる。

# 初めに
私は普段ゲームを作っていますが、作れるアプリのレパートリーが増えるといいなと思って
Webアプリケーションを作ることを予定しています。
そのアプリを作るためにネットワーク図を使いたいなと思い、調べたところ良さそうなライブラリが[vis.js](https://visjs.org/index.html)でした。

# サンプルを実行してみる
[公式のベーシックサンプル](https://visjs.org/examples/network/basicUsage.html)を見てみました。
## サンプルデモ
![6f30ec843e0baad103869af26beadc52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/1916d2de-b92d-f737-a8df-b07942b7b006.gif)
ノードを動かしてみるとめっちゃプルンプルンしています。

## サンプル実行方法
[DLページ](https://visjs.org/index.html#download_install)でzipをダウンロードして、その中にあるdistディレクトリをコピーして
distディレクトリを置いた同じディレクトリ内に以下のソースコードを配置するとローカルで動きました。
### ディレクトリ構成
```
Sample
 |-dist/
 |-Basic.html
```
### ソースコード
```Basic.html
<!doctype html>
<html>
<head>
  <title>Network | Basic usage</title>

  <script type="text/javascript" src="./dist/vis.js"></script>
  <link href="./dist/vis-network.min.css" rel="stylesheet" type="text/css" />

  <style type="text/css">
    #mynetwork {
      width: 600px;
      height: 400px;
      border: 1px solid lightgray;
    }
  </style>
</head>
<body>

<p>
  Create a simple network with some nodes and edges.
</p>

<div id="mynetwork"></div>

<script type="text/javascript">
  // create an array with nodes
  var nodes = new vis.DataSet([
    {id: 1, label: 'Node 1'},
    {id: 2, label: 'Node 2'},
    {id: 3, label: 'Node 3'},
    {id: 4, label: 'Node 4'},
    {id: 5, label: 'Node 5'}
  ]);

  // create an array with edges
  var edges = new vis.DataSet([
    {from: 1, to: 3},
    {from: 1, to: 2},
    {from: 2, to: 4},
    {from: 2, to: 5},
    {from: 3, to: 3}
  ]);

  // create a network
  var container = document.getElementById('mynetwork');
  var data = {
    nodes: nodes,
    edges: edges
  };
  var options = {};
  var network = new vis.Network(container, data, options);
</script>


</body>
</html>

```

# ノードの名前を変更してみる
サンプルをパッとみた感じノードの名前を変更しているものがなかったので、
実際に公式ドキュメントを読みながら手を動かしてみました。

サンプルの実行は簡単ですが、こういうものはやはり実際手を動かすことで頭に入ってきますね。
以下処理を加えたコードです。
## ソースコード
```Basic.html
<!doctype html>
<html>
<head>
  <title>Network | Basic usage</title>

  <script type="text/javascript" src="./dist/vis.js"></script>
  <link href="./dist/vis-network.min.css" rel="stylesheet" type="text/css" />

  <style type="text/css">
    #mynetwork {
      width: 600px;
      height: 400px;
      border: 1px solid lightgray;
    }
  </style>
</head>
<body>

<p>
  Create a simple network with some nodes and edges.
</p>

<div id="mynetwork"></div>

<script type="text/javascript">
  var nowSelectedNode = "";

  // create an array with nodes
  var nodes = new vis.DataSet([
    {id: 1, label: 'Node 1'},
    {id: 2, label: 'Node 2'},
    {id: 3, label: 'Node 3'},
    {id: 4, label: 'Node 4'},
    {id: 5, label: 'Node 5'}
  ]);

  // create an array with edges
  var edges = new vis.DataSet([
    {from: 1, to: 3},
    {from: 1, to: 2},
    {from: 2, to: 4},
    {from: 2, to: 5},
    {from: 3, to: 3}
  ]);

  // create a network
  var container = document.getElementById('mynetwork');
  var data = {
    nodes: nodes,
    edges: edges
  };
  var options = {};
  var network = new vis.Network(container, data, options);

//追記start---------------------------------------------------------
  network.on("click",function(params){
    var nodeId = params['nodes'][0];
    if(nodeId == null){
      return;
    }
    document.getElementById('test_p').innerHTML = nodeId;
    nowSelectedNode = nodeId;
  });

function OnButtonClick(){
  var str = document.getElementById('node_input').value;
  if(nowSelectedNode == null){
    return;
  }
  nodes.update({id: nowSelectedNode, label: str});
}
//追記end---------------------------------------------------------

</script>
<!-- 追記 -->
<!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
<table>
  <tr>
    <td>ノード名</td>
    <td><input id="node_input" type="text" name="name" size="30" maxlength="20" value="node"></td>
    <td><input type="button" onclick="OnButtonClick();" value="変更"></td>
  </tr>
</table>
<p id="test_p">
</p>
<!-- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -->
</body>
</html>

```

## 実行結果
![215e4672852e7ba9ba77d2ae3729f7f3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/38e1a95d-20fc-f02c-61bf-0478c1b30fee.gif)

# 最後に
何かアプリを作りたいと思った時に、こういったライブラリがあるととても楽ですね！
自身エンジニアとして未熟者なので、必要なライブラリをすぐに使えるようになる力

- ドキュメントを読む力
- サンプルを読む力
- 勘

など記事を書くことを通して付けていきたいと思っています。