Rendering vis.js network into container via React.js
this works for me:
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}
]);
var data = {
nodes: nodes,
edges: edges
};
var options = {};
// initialize your network!
var VisNetwork = React.createClass({
componentDidMount(){
var network = new vis.Network(this.refs.myRef, data, options);
},
render: function() {
return <div ref="myRef"></div>;
}
});
ReactDOM.render(
<VisNetwork />,
document.getElementById('container')
);
https://jsfiddle.net/ginollerena/69z2wepo/63263/
From React 16.3, it is recommended to use React.createRef
Docs
Updating @Gino's answer with 16.3 style.
import { DataSet, Network } from 'vis';
import React, { Component, createRef } from "react";
const nodes = new 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
const edges = new DataSet([
{ from: 1, to: 3 },
{ from: 1, to: 2 },
{ from: 2, to: 4 },
{ from: 2, to: 5 }
]);
const data = {
nodes: nodes,
edges: edges
};
const options = {};
// initialize your network!
class VisNetwork extends Component {
constructor() {
super();
this.network = {};
this.appRef = createRef();
}
componentDidMount() {
this.network = new Network(this.appRef.current, data, options);
}
render() {
return (
<div ref={this.appRef} />
);
}
}
Here is a modern example using functional components and React hooks.
package.json
{
"dependencies": {
"react": "16.13.0",
"react-dom": "16.13.0",
"vis-network": "7.4.0"
}
}
VisNetwork.js
import React, { useEffect, useRef } from 'react';
import { DataSet, Network} from 'vis-network/standalone/esm/vis-network';
const VisNetwork = () => {
// A reference to the div rendered by this component
const domNode = useRef(null);
// A reference to the vis network instance
const network = useRef(null);
// An array of nodes
const nodes = new 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' }
]);
// An array of edges
const edges = new DataSet([
{ from: 1, to: 3 },
{ from: 1, to: 2 },
{ from: 2, to: 4 },
{ from: 2, to: 5 }
]);
const data = {
nodes,
edges
};
const options = {};
useEffect(
() => {
network.current = new Network(domNode.current, data, options);
},
[domNode, network, data, options]
);
return (
<div ref = { domNode } />
);
};
export default VisNetwork;
Here is the modern Typescript way:
import React, { useEffect, useRef } from "react";
import {
DataSet,
Network,
Options,
Data,
} from "vis-network/standalone/esm/vis-network";
export const LogicTreePanel = () => {
// A reference to the div rendered by this component
const domNode = useRef<HTMLDivElement>(null);
// A reference to the vis network instance
const network = useRef<Network | null>(null);
// An array of nodes
const nodes = new 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" },
]);
// An array of edges
const edges = new DataSet([
{ from: 1, to: 3 },
{ from: 1, to: 2 },
{ from: 2, to: 4 },
{ from: 2, to: 5 },
]);
const data: Data = {
nodes,
edges,
};
const options: Options = {};
useEffect(() => {
if (domNode.current) {
network.current = new Network(domNode.current, data, options);
}
}, [domNode, network, data, options]);
return (
<div
ref={domNode}
/>
);
};