当前位置: 首页 > 知识库问答 >
问题:

React钩子组件在API调用之前呈现

曹新觉
2023-03-14

我需要创建一个React应用程序,让你列出口袋妖怪和类型。我从PokeAPI获取数据。从应用程序组件获取数据然后将其传递给子组件是一种好的做法,还是从子组件获取数据更好?

我在主应用程序中获取它,我可以看到获取工作,因为我需要控制台。记录数据,但是我的组件没有得到它,因此我得到了一个道具。map不是中的函数。

这是我的应用程序。js:

import React, { useState } from "react";
import logo from "./logo.svg";
import "./App.css";
import axios from "axios";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import PokemonList from "./components/PokemonList";

const App = (props) => {
  const [pokemons, setPokemons] = useState([]);

  const [types, setTypes] = useState([]);

  const [isLoading, setIsLoading] = useState(true);

  const getPokemons = () => {
    const axios = require("axios").default;
    axios.get("https://pokeapi.co/api/v2/pokemon").then(function (response) {
      console.log("Fetched pokemons");
      console.log(response.data.results);
      setIsLoading(false);
      setPokemons(response.data.results);
    });
  };

  const getTypes = () => {
    setIsLoading(true);
    const axios = require("axios").default;
    axios.get("https://pokeapi.co/api/v2/type").then(function (response) {
      console.log("Fetched types");
      console.log(response.data.results);
      setIsLoading(false);
      setTypes(response.data.results);
    });
  };

  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/pokemons" onClick={getPokemons}>
                Pokemons
              </Link>
            </li>
            <li>
              <Link to="/types">Types</Link>
            </li>
          </ul>
        </nav>

        {/* A <Switch> looks through its children <Route>s and
            renders the first one that matches the current URL. */}
        <Switch>
          <Route path="/pokemons">
            <Pokemons pokemons={pokemons} />
          </Route>
          <Route path="/types">
            <Types />
          </Route>
        </Switch>
      </div>
    </Router>
  );
};

function Pokemons(pokemons) {
  return <PokemonList props={pokemons} />;
}

function Types(typeList) {
  return <h2>TYPES:</h2>;
}

export default App;

这是我的口袋妖怪列表。js:

import React from "react";
import { Card } from "semantic-ui-react";
import PokeCard from "./PokeCard";

const Pokemonlist = (props) => {
  let content = (
    <Card.Group>
      {props.map(function (object, i) {
        return <PokeCard pokemon={object} key={i} />;
      })}
    </Card.Group>
  );

  return content;
};

export default Pokemonlist;

最后一个是我的PokeCard。js

import { Card, Image } from "semantic-ui-react";
import React from "react";

const PokeCard = (pokemon) => {
  let content = (
    <Card>
      <Card.Content>
        <Image floated="right" size="mini" src={pokemon.img} />
        <Card.Header>{pokemon.name}</Card.Header>
        <Card.Meta>{pokemon.base_experience}</Card.Meta>
        <Card.Description>ID: {pokemon.id}</Card.Description>
      </Card.Content>
    </Card>
  );

  return content;
};

export default PokeCard;

所以基本的想法是:

在主页上,单击Pokemons按钮,该按钮调用fetch,然后呈现PokemonList组件,该组件基本上只呈现我获取的数据中的多个PokeCard组件。

1、我在这里错过了什么?

2、在我的情况下,如果没有任何变化,我需要使用useEffect吗?

3、我应该什么时候取数据,在哪里取?

编辑:我想使用零类的钩子

共有1个答案

能旭
2023-03-14

这是我回答的摘要

  • 如果需要保存网络使用情况,最好在父组件中获取一些初始数据,然后在子组件中发出进一步请求
  • 在渲染元素之前,使用useffecthook获取结果
  • 您缺少的是您没有在口袋妖怪中使用道具,您应该将get调用放在App组件中的useffect钩子中,因为子组件在道具传递给它之前正在渲染,这就是您得到未定义的错误的原因

 类似资料:
  • 但我的问题是我如何强制上面的功能组件重新呈现立即与钩子?

  • 得到以下错误。请帮帮这个。第9:36行:React钩子“useContext”不能在类组件中调用。React钩子必须在React函数组件或自定义React钩子函数react-hooks/rules-of-hooks第9:47行:“AccountContext”未定义no-undef第126:37行:“switch tosignup”未定义no-undef

  • 一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。 第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多 第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。 尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 我试图建立一个连接4的游戏,它有一个由7列组件组成的板组件,所有包含6个空间组件。每个列的上方都有一个拖放按钮,该按钮将用于将该件拖放到列中。为了在“红色”和“黑色”玩家之间交替,我创建了一个状态“redorblue”,它返回一个布尔值。 简而言之,当单击Drop按钮时,我希望切换“redorblue”的值,以跟踪轮到谁了。我已经将onClick函数设置为setState({redorblue:!

  • 我正在学习React钩子,这意味着我将不得不从类转移到函数组件。以前,在类中,我可以拥有与状态无关的类变量,我可以在不重新呈现组件的情况下更新这些变量。现在我试图用钩子重新创建一个组件作为函数组件,我遇到了这样一个问题:我不能(就我所知)为该函数创建变量,因此存储数据的唯一方法是通过钩子。然而,这意味着每当该状态更新时,我的组件将重新呈现。 我已经在下面的示例中说明了这一点,我试图将类组件重新创建