Nor*_*rth 1 async-await typescript reactjs react-typescript
目前我正在练习 react-ts 通过异步获取器获取 json 数据
示例代码如下
//Test.tsx
import React, { useState, useEffect } from 'react';
import fetcher from 'api/fetcher';
interface Todo {
userId: number;
id: number;
title: string;
completed: boolean;
}
const Test: React.FC = () => {
const [data, setData] = useState<Todo[]| Promise<Todo[]>>([{
userId: 1,
id: 1234,
title: "test",
completed: false
}]);
useEffect(() => {
const result = fetcher("https://jsonplaceholder.typicode.com/todos");
setData(result);
console.log(result);
}, [])
return (
<div>
//error in here
**{data && data.map()}**
{/* {data && data.map((item: Todo)=> {
<div>{item.id}<div>
})} */}
</div>
);
}
export default Test;
Run Code Online (Sandbox Code Playgroud)
//fetcher.ts
async function fetcher(url: RequestInfo) {
try {
const res = await fetch(url);
const json = await res.json();
console.log("json: ", json);
return json;
} catch (e) {
throw e;
}
}
export default fetcher;
Run Code Online (Sandbox Code Playgroud)
错误消息:类型“Todo[]”上不存在属性“map”| 承诺'。'Promise' 类型不存在属性 'map'
我知道 map 方法不能在 Promise 对象上使用。由于异步调用,初始数据类型设置为 Promise 类型,并在 fetch 解决时切换到 Todo[]。
如何解决这个问题动态使用map方法
您不应将承诺设置为 state 而是设置承诺解决后获得的结果。等待承诺解决你可以使用async-await或conventional .then方法。同时从 useState 值中删除 Promise 作为类型
const Test: React.FC = () => {
const [data, setData] = useState<Todo[]>([{
userId: 1,
id: 1234,
title: "test",
completed: false
}]);
useEffect(() => {
fetcher("https://jsonplaceholder.typicode.com/todos").then((result) => {
setData(result);
});
}, [])
return (
<div>
{data && data.map((item: Todo)=> {
<div>{item.id}<div>
})}
</div>
);
}
export default Test;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2256 次 |
| 最近记录: |