ReasonReact useState 与获取的数据
ReasonReact useState with fetched data
我已经使用 React 很长时间了,我想给 Reason React 一个机会。然后我创建了一个小项目来从 Github 存储库中获取数据,然后显示结果。
我想使用 React Hooks 并将结果存储到我的状态中。
这是我正在尝试做的事情:
type githubRepo = {
name: string,
url: string,
};
module Decode = {
let repo = (repo): githubRepo =>
Json.Decode.{
name: repo |> field("name", string),
url: repo |> field("url", string),
};
};
let useFetch = (~url: string, ~options=?, ()) => {
let (loading, setLoading) = React.useState(() => true);
let (result, setResult) = React.useState(() => []);
React.useEffect1(
() => {
ignore(
Js.Promise.(
Fetch.fetch(url)
|> then_(Fetch.Response.json)
|> then_(json =>
json
|> Decode.repo
|> (
decodedRepo => {
Js.log(decodedRepo);
setResult(result => decodedRepo);
setLoading(_ => false);
Some(decodedRepo);
}
)
|> resolve
)
|> catch(_err => resolve(None))
),
);
None;
},
[||],
);
(loading, result);
};
当我尝试执行 setResult(_ => decodedRepo)
时,它会抛出错误
This has type: githubRepo But somewhere wanted: list('a)
我知道我已经将我的 React.useState 初始化为一个空列表,但我不知道如何在里面设置我的 decodedRepo
。
这是 Js.log(decodedRepo)
的结果:
Array [ "Node.js", "https://api.github.com/orgs/nodejs" ]
0: "Node.js"
1: "https://api.github.com/orgs/nodejs"
length: 2
我也想知道有没有办法初始化没有值的useState?
您可以使用 list spread syntax 将项目添加到列表中,类似于 JavaScript:
setResult(result => [decodedRepo, ...result]);
但是,如果您不想处理超过一项的可能性,则需要使用限制为零项或一项的容器。这是the option
type。在使用中它看起来像这样:
let (result, setResult) = React.useState(() => None);
setResult(result => Some(decodedRepo));
然后当您使用 result
时,您不得不处理它可能包含或不包含项目的可能性:
switch (result) {
| Some(decodedRepo) => ...
| None => ...
}
我已经使用 React 很长时间了,我想给 Reason React 一个机会。然后我创建了一个小项目来从 Github 存储库中获取数据,然后显示结果。
我想使用 React Hooks 并将结果存储到我的状态中。
这是我正在尝试做的事情:
type githubRepo = {
name: string,
url: string,
};
module Decode = {
let repo = (repo): githubRepo =>
Json.Decode.{
name: repo |> field("name", string),
url: repo |> field("url", string),
};
};
let useFetch = (~url: string, ~options=?, ()) => {
let (loading, setLoading) = React.useState(() => true);
let (result, setResult) = React.useState(() => []);
React.useEffect1(
() => {
ignore(
Js.Promise.(
Fetch.fetch(url)
|> then_(Fetch.Response.json)
|> then_(json =>
json
|> Decode.repo
|> (
decodedRepo => {
Js.log(decodedRepo);
setResult(result => decodedRepo);
setLoading(_ => false);
Some(decodedRepo);
}
)
|> resolve
)
|> catch(_err => resolve(None))
),
);
None;
},
[||],
);
(loading, result);
};
当我尝试执行 setResult(_ => decodedRepo)
时,它会抛出错误
This has type: githubRepo But somewhere wanted: list('a)
我知道我已经将我的 React.useState 初始化为一个空列表,但我不知道如何在里面设置我的 decodedRepo
。
这是 Js.log(decodedRepo)
的结果:
Array [ "Node.js", "https://api.github.com/orgs/nodejs" ]
0: "Node.js"
1: "https://api.github.com/orgs/nodejs"
length: 2
我也想知道有没有办法初始化没有值的useState?
您可以使用 list spread syntax 将项目添加到列表中,类似于 JavaScript:
setResult(result => [decodedRepo, ...result]);
但是,如果您不想处理超过一项的可能性,则需要使用限制为零项或一项的容器。这是the option
type。在使用中它看起来像这样:
let (result, setResult) = React.useState(() => None);
setResult(result => Some(decodedRepo));
然后当您使用 result
时,您不得不处理它可能包含或不包含项目的可能性:
switch (result) {
| Some(decodedRepo) => ...
| None => ...
}