【发布时间】:2021-11-06 03:32:46
【问题描述】:
open 和 模块前缀 应该如何在 rescript 和 rescript-react 中工作。它似乎没有遵守文档。例如,我有一个文件阅读器模块
FileReader.res
module FileReader = {
type fileReader
type file = {"name": string, "lastModified": int, "size": int, "type__": string}
@new external createFileReader: unit => fileReader = "FileReader"
@bs.send
external readAsDataURL: (fileReader, file) => unit = "readAsDataURL"
let onload: (fileReader, string => unit) => unit = %raw(`
function (reader, cb) {
reader.onload = function (e) {
cb(e.target.result);
}
}
`)
let fileToDataUrl: (file, string => unit) => unit = (file, continue) => {
let reader = createFileReader()
onload(reader, continue)
readAsDataURL(reader, file)
}
}
我正在尝试从反应组件中使用:
上传.res
open FileReader
let k = x => (_ => x)
let setState = stateHook => (newVal => stateHook(_ => newVal))
let firstFileFromEvent = event => ReactEvent.Form.target(event)["files"][0]
@react.component
let make = () => {
let (dataUrl, setDataUrl) = React.useState(k(""))
let setDataUrlState = setState(setDataUrl)
let fileOnChange = (event) =>
event ->
firstFileFromEvent ->
FileReader.fileToDataUrl(setDataUrlState)
<div>
<input type_="file" onChange=fileOnChange/>
<img src=dataUrl/>
</div>
}
让代码编译的唯一方法是
- 打开
- 引用模块名称
我的理解是你只需要做一个或另一个。如果我删除open 语句,这是编译器的输出
我们为您发现了一个错误!
src/Upload.res:15:13-3613 ┆ 事件 -> 14 ┆ firstFileFromEvent -> 15 ┆
FileReader.fileToDataUrl(setDataUrlState) 16 ┆ 17 ┆在 FileReader 中找不到值 fileToDataUrl
重新添加 open 语句并将语句 FileReader.fileToDataUrl(setDataUrlState) 更改为 fileToDataUrl(setDataUrlState) 会导致此异常:
我们为您发现了一个错误!
src/Upload.res:15:13-2513 ┆ 事件 -> 14 ┆ firstFileFromEvent -> 15 ┆
fileToDataUrl(setDataUrlState) 16 ┆ 17 ┆找不到值fileToDataUrl
我使用open 语句和函数调用的模块前缀发布的源代码可以编译但有一个警告:
警告编号 44
src/Upload.res:1:1-151 │ 打开 FileReader 2 │ 3 │ let k = x => (_ => x)
这个 open 语句隐藏了模块标识符 FileReader(它 以后用)
我在 Mac 上;使用 rescript 9.1.4;
【问题讨论】: