Attempting to use D3 with React v16
forked from Fasani's block: React V16 + D3 + Force
license: mit |
Attempting to use D3 with React v16
forked from Fasani's block: React V16 + D3 + Force
<!DOCTYPE html> | |
<html> | |
<head> | |
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js" charset="utf-8"></script> | |
<script src="https://unpkg.com/react@next/umd/react.production.min.js" charset="utf-8"></script> | |
<script src="https://unpkg.com/react-dom@next/umd/react-dom.production.min.js" charset="utf-8"></script> | |
<!-- <script src="fiber.js" charset="utf-8"></script> --> | |
<script src="https://cdn.jsdelivr.net/npm/create-react-class@15.6.0/create-react-class.min.js" charset="utf-8"></script> | |
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> | |
</head> | |
<body> | |
<div id="container"></div> | |
<script type="text/babel"> | |
var size = 1000; | |
var height = 500; | |
var width = 960; | |
var charge = -0.3; | |
var dataGlobal = d3.range(size).map(function() { | |
return { r: Math.floor(Math.random() * 8 + 2) }; | |
}); | |
var start = new Date(); | |
var time = 0; | |
var ticks = 0; | |
var force = d3.layout | |
.force() | |
.size([width, height]) | |
.nodes(dataGlobal) | |
.charge(function(d) { | |
return d.r * d.r * charge; | |
}) | |
.start(); | |
var BubbleChart = createReactClass({ | |
displayName: "BubbleChart", | |
render: function() { | |
return ( | |
<Chart width={this.props.width} height={this.props.height}> | |
<DataSeries data={this.props.data} /> | |
</Chart> | |
); | |
} | |
}); | |
var Chart = createReactClass({ | |
displayName: "Chart", | |
render: function() { | |
return ( | |
<svg width={this.props.width} height={this.props.height}> | |
{this.props.children} | |
</svg> | |
); | |
} | |
}); | |
var DataSeries = createReactClass({ | |
displayName: "DataSeries", | |
getInitialState: function() { | |
return { data: this.props.data }; | |
}, | |
componentDidMount: function() { | |
var _self = this; | |
force.on("tick", function() { | |
var renderStart = new Date(); | |
window.requestAnimationFrame(_self.tick); | |
time += new Date() - renderStart; | |
ticks++; | |
}); | |
}, | |
tick: function() { | |
this.setState({ data: dataGlobal }); | |
}, | |
render: function() { | |
var circles = this.state.data.map(function(point, i) { | |
return ( | |
<circle | |
key={i} | |
cx={0} | |
cy={0} | |
r={point.r} | |
transform={`translate(${point.x}, ${point.y})`} | |
fill="steelblue" | |
/> | |
); | |
}); | |
return [...circles]; | |
} | |
}); | |
var container = document.getElementById("container"); | |
ReactDOM.render( | |
<BubbleChart data={dataGlobal} height={height} width={width} />, | |
container | |
); | |
force.on("end", function() { | |
var totalTime = new Date() - start; | |
console.log("Total Time:", totalTime); | |
console.log("Render Time:", time); | |
console.log("Ticks:", ticks); | |
console.log("Average Time:", totalTime / ticks); | |
}); | |
</script> | |
</html> |