Example React App with Fabric Js by Stefan Hayden
Example of how to use React with Fabric Js
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js"></script>
<script src="https://npmcdn.com/react@latest/dist/react-with-addons.js"></script>
<script src="https://npmcdn.com/react-dom@latest/dist/react-dom.js"></script>
<!-- React Setup -->
<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"></script>
<!-- Nuclear Setup -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/nuclear-js/1.3.0/nuclear.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
<!-- Fabric Setup -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.4/fabric.min.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
<script>
// this keyMirror function is just a usefull utility
var keyMirror = function(obj) {
var ret = {};
var key;
if (!(obj instanceof Object && !Array.isArray(obj))) {
throw new Error('keyMirror(...): Argument must be an object.');
}
for (key in obj) {
if (obj.hasOwnProperty(key)) {
ret[key] = key;
}
}
return ret;
};
</script>
CSS
body {
background: #16191e;
color: #FFF;
font-family: OpenSans,Arial,sans-serif
}
canvas {
border:1px solid;
}
.canvas-container {
float:left;
}
button {
margin: 0 10px 5px 10px;
}
JavaScript 1.7
var reactor = new Nuclear.Reactor({ debug: true });
var keys = keyMirror({ fabricData: null, activeObject: null });
// globally accessable fabricCanvas instance
var fabricCanvas = new fabric.Canvas();
// A place to put fabric data
var fabricStore = Nuclear.Store({
getInitialState() {
return Nuclear.toImmutable({
fabricData: {
objects: [],
},
activeObject: false,
})
},
initialize() {
this.on(keys.fabricData, this.saveFabricData)
this.on(keys.activeObject, this.saveActiveObject)
},
saveFabricData(state, fabricData) {
return state.set('fabricData', Nuclear.toImmutable(fabricData));
},
saveActiveObject(state, value) {
return state.set('activeObject',value);
}
});
reactor.registerStores({
'fabricStore': fabricStore,
});
var Fabric = React.createClass({
componentDidMount() {
var el = ReactDOM.findDOMNode(this);
// Here we have the canvas so we can initialize fabric
fabricCanvas.initialize(el, {
height: 300,
width: 300,
});
// on mouse up lets save some state
fabricCanvas.on('mouse:up', () => {
reactor.dispatch(keys.fabricData, fabricCanvas.toObject());
reactor.dispatch(keys.activeObject, !!fabricCanvas.getActiveObject());
});
// an event we will fire when we want to save state
fabricCanvas.on('saveData', () => {
reactor.dispatch(keys.fabricData, fabricCanvas.toObject());
reactor.dispatch(keys.activeObject, !!fabricCanvas.getActiveObject());
fabricCanvas.renderAll(); // programatic changes we make will not trigger a render in fabric
});
},
render() {
return <canvas></canvas>
}
});
var NewObjects = React.createClass({
mixins: [reactor.ReactMixin],
getDataBindings() {
return {
fabricData: ['fabricStore', 'fabricData'],
activeObject: ['fabricStore', 'activeObject'],
};
},
render: function() {
if (this.state.fabricData.get('objects').size == 0) {
// no object is on the...