ReScript
參考 Adding ReasonML to an existing codebase (Part 1)後,現在除了 PureScript 外,也可以用 ReScript 寫 React 元件啦 XD
假設我想重現
let useImageData = url => {
let (imageData, setImageData) = React.useState(() => /* 一些程式碼 */);
React.useEffect1(() => {
// 一些程式碼
}, [url])
imageData;
}
看 ReScript 教學時會注意到,首先
參考 ReScript React 文件發現
查了一下在 ReScript 裡因為沒有
let (imageData, setImageData) = React.useState(() => Js.Nullable.undefined);
為了在
React.useEffect1(() => {
let imageData = Js.Nullable.toOption(imageData);
switch (imageData) {
| Some(_) => None; // 什麼都不做
| None => {
// 做些什麼
}
}
}, [url]);
操作 DOM 時,可以像
我會用上
open Webapi.Dom;
open Webapi.Canvas;
open HtmlImageElement;
目前
module MyCanvas2d = {
include Canvas2d;
[@bs.send] external drawImage : (Canvas2d.t, HtmlImageElement.t, float, float) => unit = "drawImage";
}
接著就能操作 DOM :
switch (imageData) {
| Some(_) => None;
| None => {
let img = HtmlImageElement.make();
img -> setCrossOrigin(Some("anonymous"))
img -> setSrc(url);
let rec f = (_) => {
let canvas = document |> Document.createElement("canvas");
let width = img |> width;
let height = img |> height;
canvas -> CanvasElement.setWidth(width);
canvas -> CanvasElement.setHeight(height);
let ctx = CanvasElement.getContext2d(canvas);
ctx |> MyCanvas2d.drawImage(img, 0.0, 0.0);
let imageData = ctx -> MyCanvas2d.getImageData(
~sx=0.0,
~sy=0.0,
~sw=Js.Int.toFloat(width),
~sh=Js.Int.toFloat(height)
);
setImageData((_) => Js.Nullable.return(imageData));
img |> removeLoadEventListener(f);
}
img |> addLoadEventListener(f);
Some(() => {
img |> removeLoadEventListener(f);
});
}
}
要注意的是這裡用上
有個 issue 討論到
附上
