首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React Typescript fetch: useState UseEffect pokeapi

React Typescript fetch: useState UseEffect pokeapi
EN

Stack Overflow用户
提问于 2021-07-01 09:19:03
回答 2查看 782关注 0票数 0

我正在尝试学习如何在React中获取数据并以表格/列表/图形的形式显示。

我提取了一个组件的fetch,虽然我可以让列表出现,但我认为这是错误的-为什么以及如何修复?

代码语言:javascript
复制
// getData.tsx
import React, { useState, useEffect } from 'react';
    
let myArray: string[] = [];
export default function GetData() {  
    const [info, setData] = useState([]);
    
    useEffect(() => {
        getMyData();
    }, []);
    
    const getMyData = async () => {
        const response = await fetch('https://pokeapi.co/api/v2/type')
        const data =await response.json();
        //console.log(data.results)
        for (var i = 0; i < data.results.length; i++) {     
            myArray.push(data.results[i].name)   
            setData(data.results[i].name)
        }
        console.log(info)
    }
   
    return (
        <div>
            <h1>get Data</h1>
           {myArray.map((value,index) => {
               return <li key={index}>{value}</li>;
           })}
        </div>
    )
}

也是同样的问题,但不明白为什么名称和数组不能同时工作?

代码语言:javascript
复制
export default function GetData(){
    const names: string[] = ["whale", "squid", "turtle", "coral", "starfish"];
        
    const theArray: string[] = [];
        
    const getData = async () => {
        const response = await fetch('https://pokeapi.co/api/v2/type');
        const data = await response.json()
        
        //for (var i = 0; i < data.results.length; i++) {  
        for (var i = 0; i < 5; i++) {  
            theArray.push(data.results[i].name)
        }
        console.log(theArray)
    }
        
    console.log(names)
    console.log(theArray)
    
    getData()
        
    return (
        <div>
            <ul>{names.map(name => <li key={name}> {name} </li>)}</ul>
            <h1>get Data</h1>
            <ul>{theArray.map(name => <li key={name}> {name} </li>)}</ul>
        </div>
    )
}
EN

回答 2

Stack Overflow用户

发布于 2021-07-01 16:19:22

您没有使用状态数据...问题是。

正确的方法是:

代码语言:javascript
复制
const [data, setData] = useState([])
useEffect(() => {
  fetch('https://pokeapi.co/api/v2/type')
  .then(res => res.json())
  .then(setData)
},[])

return <div>
 <ul>
  {data.map((name) => <li key={name}>{name}</li>}
 </ul>
</div>
票数 1
EN

Stack Overflow用户

发布于 2021-07-01 16:20:08

问题是getData被声明为async函数。这意味着它将返回Promise,您可以对其执行await操作并获得结果。但你从来没这么做过。您在没有使用await的情况下使用它,本质上不是等待它完成并丢弃它的结果。

要获得async函数的结果,您应该对其执行await操作。在您的第二个组件中,您必须编写以下代码:

代码语言:javascript
复制
    ...
    console.log(names)
    console.log(theArray)
    
    await getData() // add 'await' to well... wait for the result of the getData execution
        
    return (
    ...

但是你也只能在async函数中使用await。就我而言,您现在不能使用async组件(react@16-17)。因此,第二个组件不会按预期工作。至少在react能够支持async组件之前。

尽管您的第一个组件也存在一些问题。

代码语言:javascript
复制
let myArray: string[] = [];

在模块作用域中声明,它将在组件的所有实例之间共享(而不是重置)。这可能(也将)导致非常意想不到的结果。

此外,在声明getMyData之前,使用它不会得到linting错误,这是很不寻常的。但我认为这只是复制粘贴代码到SO的一个伪像。

另一个问题是你在你的组件中使用setData,不是用来设置myArray的内容,而是用来触发rerender。这是非常脆弱的行为。您应该直接设置新状态,react将触发下一次呈现,并将使用更新后的状态。

为了正常工作,你的第一个组件应该写成:

代码语言:javascript
复制
import React, { useState, useEffect } from 'react'
    
export default function GetData() {  
    const [myArray, setMyArray] = useState([])
    
    const getMyData = async () => {
        const response = await fetch('https://pokeapi.co/api/v2/type')
        const data = await response.json()
        const names = data.results.map((r) => r.name) // extracting 'name' prop into array of names

        setMyArray(names)
    }

    useEffect(() => {
        getMyData();
    }, []);
   
    return (
        <div>
            <h1>get Data</h1>
            {myArray.map((value,index) => (
                <li key={`${index}-${value}`}>{value}</li>
            ))}
        </div>
    )
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68203192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档