Thursday, May 23, 2024
 Popular · Latest · Hot · Upcoming
97
rated 0 times [  98] [ 1]  / answers: 1 / hits: 33658  / 9 Years ago, wed, november 25, 2015, 12:00:00

I made a color picker with React and Canvas. Currently the components are rendered in React and canvas is done with vanilla javascript. I'd like to two to mesh more, so I want the click events to be handled with React.



For example, this



colorStrip.addEventListener(click, click, false);

function click(e) {
x = e.offsetX;
y = e.offsetY;
var imageData = context.getImageData(x, y, 1, 1).data;
rgbaColor = 'rgba(' + imageData[0] + ',' + imageData[1] + ',' + imageData[2] + ',1)';
fillGradient();
}


I would hope would be able to translate to this



var ColorPicker = React.createClass({
colorStripClick: function() {
//handle click events here
},
render: function() {
var styles = {
opacity: this.props.isVisible ? '1' : '0'
};
return(
<div id=color-picker style={styles}>
<canvas id=color-block height=150 width=150></canvas>
<canvas id=color-strip height=150 width=30 onClick={this.colorStripClick}></canvas>
</div>
);
}
});


But that doesn't work because I don't know how to access context. How can I get access to the canvas properties with React? Is there a way to access it before the click?



UPDATE



I used David's answer but I was getting errors by putting a function in ref so I did ref=canvasBlock and ref=canvasStrip instead and then assigned the context in componentDidMount


More From » html

 Answers
16

You can add a ref function attribute on the canvas element:



<canvas id=color-strip ref={(c) => this.context = c.getContext('2d')} height=...


Then you’ll have access to the context through this.context:



colorStripClick: function() {
var imageData = this.context.getImageData(x, y, 1, 1).data
}


You can also use the event object to access to DOM node as already pointed out, but this way you’ll have access from anywhere, not just event handlers.


[#64268] Tuesday, November 24, 2015, 9 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jack

Total Points: 557
Total Questions: 96
Total Answers: 80

Location: Saint Helena
Member since Mon, Jan 16, 2023
1 Year ago
;