You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击「返回列表」为何跳转至首页?(React Hooks场景)

解决React-Query Pokemon应用中「返回列表」按钮无法跳转的问题

问题原因

当前点击「返回列表」按钮时,执行的是setPokemon(pokemon.name),这会将状态设置为当前Pokemon的名称(非null值)。而App组件的渲染逻辑是:当pokemon有值时显示详情页,仅当pokemon为null时才会渲染列表页,因此按钮无法回到列表。

修正方案

将「返回列表」按钮的onClick回调改为传入null,重置状态至初始值,触发App组件渲染列表页。

错误代码:

<a href="#" onClick={() => setPokemon(pokemon.name)}>
  Back to the list
</a>

修正后代码:

<a href="#" onClick={() => setPokemon(null)}>
  返回列表
</a>

完整修正代码

import "./styles.css";
import { QueryClient, QueryClientProvider, useQuery } from "react-query";
import axios from "axios";
import { useState } from "react";

const queryClient = new QueryClient();

function App() {
  // useEffect(() => {
  //   queryClient.clear();
  // }, []);

  const [pokemon, setPokemon] = useState(null);
  return (
    <QueryClientProvider client={queryClient}>
      <div className="App">
        {pokemon ? (
          <Pokemon pokemon={pokemon} setPokemon={setPokemon} />
        ) : (
          <PokemonList setPokemon={setPokemon} />
        )}
      </div>
    </QueryClientProvider>
  );
}

export default App;

function usePokemonList() {
  return useQuery("pokemon", async () => {
    const { data } = await axios.get(
      "https://pokeapi.co/api/v2/pokemon?offset=0&limit=50"
    );
    return data.results;
  });
}

function usePokemon(name) {
  return useQuery(["pokemon", name], async () => {
    const { data } = await axios.get(
      `https://pokeapi.co/api/v2/pokemon/${name}`
    );
    return data;
  });
}

function Pokemon({ pokemon, setPokemon }) {
  const { isLoading, data } = usePokemon(pokemon);
  return (
    <div>
      <a href="#" onClick={() => setPokemon(null)}>
        返回列表
      </a>
      {isLoading ? (
        <p>加载中...</p>
      ) : (
        <div>
          <h1>{pokemon}</h1>
          <img src={data.sprites.front_default} alt={pokemon} />
        </div>
      )}
    </div>
  );
}

function PokemonList({ setPokemon }) {
  const { isLoading, data } = usePokemonList();
  return (
    <div>
      {isLoading ? (
        <p>加载中...</p>
      ) : (
        <ul>
          {data.map((pokemon) => (
            <li key={pokemon.name}>
              <a onClick={() => setPokemon(pokemon.name)} href="#">
                {pokemon.name}
              </a>
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

内容的提问来源于stack exchange,提问作者bosari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:24:46