I am creating a simple react app (HTML) that allows a user to browse to an image on their local pc, and then displays it in an image tag. I want to take a data-url and dynamically create a hidden canvas tag (open to a different approach, but I want to resize the image, not set size contraints on the tag displaying the image). Here is my resize code
MyComponent.res (offending code)
let resize = dataUrl => {
let canvas = React.createElement(_ => React.string("canvas"), {"style": "display: none;"})
canvas.getContext("2d");
dataUrl
}
The error
We've found a bug for you!
/Users/n0321437/projects/rescript-react/from-local-template/src/Upload.res:14:12-21
12 │ let canvas = React.createElement(_ => React.string("canvas"), {"sty
│ le": "display: none;"})
13 │ //let myCanvas = canvas([React.null])
14 │ canvas.getContext("2d");
15 │ dataUrl
16 │ }
The record field getContext can't be found.
I haven't found a much documentation or postings on using createElement or createElementVariadic - so I am guessing here. It looks as though createElement
returns an object of type element
but there are no associated methods:
React.res
type element
external createElement: (component<'props>, 'props) => element = "createElement"
So I guess there are a couple of questions
React is a library that provides a declarative API for creating, inserting and updating the DOM by way of a virtual DOM. React.createElement
is an internal API used to create virtual DOM elements.
What you seem to want is to create an actual DOM element, and then NOT insert it into DOM. React is not designed to do this.
Instead what you want is bindings to the DOM API, which you could make yourself if you only need a few of its features, or you could use a full-blown set of DOM bindings such as rescript-webapi
, which conveniently also includes bindings for Canvas
.
This is how you'd create a canvas
element:
open Webapi.Dom
let canvas = document->Document.createElement("canvas")
then to get the canvas context you'd use:
open Webapi.Canvas
let context = canvas->CanvasElement.getContext2d
then use the functions in Canvas2d
to do what you want:
let image = context->Canvas2d.createImageDataCoords(~width=100, ~height=100)
...
context->Canvas2d.putImage(image, ~dx=0, ~dy=0)