我正在try 使用Reaction显示从API获取的数据.

我正在从https://pokeapi.co/docs/v2获取数据,我打算显示返回的名称和URL,并操作它们来练习条件渲染等

但我似乎陷入了一个无限循环.

我已经在谷歌上搜索过了,它建议我使用React.useEffect(),但即使我这样做了,我仍然会得到错误:

Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.

我的代码如下:

App.js

import React from 'react'
import PokemonList from "./PokemonList";

function App() {

  const [pokemons, setPokemons] = React.useState([]);

  React.useEffect(() => {
    console.log('fetch ran')
    fetch('https://pokeapi.co/api/v2/pokemon').then(res => res.json())
      .then(data => {
        setPokemons(() => data);
      })
  }, [])

  return (
    <div>
      <PokemonList pokemons={pokemons} />
    </div>
  )
}

export default App;

PockemonList.js :

import React from 'react'

export default function PokemonList({ pokemons }) {

    const [pokemonsArray, setPokemonsArray] = React.useState([]);

    setPokemonsArray(()=>pokemons.results)

    const pokemonsElements = pokemonsArray.map((pokemon) => {
        return (
            <div key={pokemon.name}>
                <h3>{pokemon.name}</h3>
                <p>{pokemon.url}</p>
                <hr />
            </div>
        )
    })
    return (
        <div>
            {pokemonsElements}
        </div>
    )
}

有时我也会收到这样的错误:

Consider adding an error boundary to your tree to customize error handling behavior.. react-refresh-runtime.development.js:315 Uncaught TypeError: Cannot read properties of undefined (reading 'map').

我假设这是BC,当数据尚未返回时,我会try 运行.map().

有谁可以帮我?如果这是一个愚蠢的问题,我很抱歉,但我已经被困了这么长时间,找不到答案.这样做的正确方法是什么?

推荐答案

您try 直接在组件内设置状态,这意味着每次组件呈现时,其状态都会更新,这会导致重新呈现,然后再次设置状态,从而导致另一次重新呈现.

正如你所说的那样.pokemonsArray.map中的map未定义的原因是因为它在组件安装和准备好之前立即被访问.

下面是如何通过修复AppPokemonList个来实现这一点

App中,不需要对setPokemons进行回调,直接传值即可.

setPokemons(data || [])

应用程序:

const [pokemons, setPokemons] = React.useState([]);

React.useEffect(() => {
  console.log('fetch ran')
  fetch('https://pokeapi.co/api/v2/pokemon')
    .then(res => res.json())
    .then(data => {
      setPokemons(data.results || []);
    })
}, [])

判断pokemons是否不可用,在这种情况下,返回NULL或调用微调组件或类似的显示列表为空或正在加载的组件.

PokemonList

export default function PokemonList({ pokemons }) {
  if (!pokemons) return null;

  return (<div> {
    pokemons.map((pokemon) => (
      <div key={pokemon.name}>
        <h3>{pokemon.name}</h3>
        <p>{pokemon.url}</p>
        <hr />
      </div>
    ))}
  </div>)
}

Reactjs相关问答推荐

react-hook-form问题:为什么getValues不返回大多数当前值?

从app.js导航,这是在BrowserRouter包装之外

构建next.js项目时状态不变,但在dev服务器中

Reactjs中的chartjs和reaction-chartjs-2的问题

使用`Link`包装`tr`标记会在Next.js中产生水合错误14

for each 子级加载父路由加载器

GitHub页面未正确显示Reaction应用程序网站

安装使用环境的BIT组件的依赖项

React组件未出现

React Router v6 路径中的符号

字段是必需的,当它没有定义时

从服务器获取数据时未定义,错误非法调用

来自一个自定义 React Native 组件的样式从另一个自定义组件移除样式

null 不是对象(判断RNSound.IsAndroid)

需要在窗口调整大小时更新 React 组件

调用 Jest 和服务方法的问题

渲染的钩子比预期的少.这可能是由 React Hooks 中意外的提前返回语句引起的

Axios 删除在带有授权令牌的react js 中不起作用

RTK 查询 POST 方法不会改变数据

React Router 6,一次处理多个搜索参数