我知道这个问题被问了很多,但我读了每一个问题和答案,我的问题并没有消失.

我正在try 访问http://localhost:3000/1,而useParams应该接收1以从API获取数据,但我正在接收undefined.

Component.tsx中,我用console.log接收useParams,但我得到的是undefined.当我正确地使用BrowserRouter和其他相关的Reaction路由导入时,所有相关文件都会被发布.

我的代码中有什么错误?为什么我找不到正确的护理人员?

加入时间:清华2007年01月25日下午3:33

import { createContext, useEffect, useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
import { CharacterSchema, PageSchema } from "../interfaces/characterInterfaces";
import { IGetAllCharacters } from "../interfaces/contextInterfaces";
import { IChildren } from "../interfaces/reactInterfaces";
import api from "../services/api";

export const GetAllCharactersContext = createContext<IGetAllCharacters>({} as IGetAllCharacters);

export const GetAllCharactersInfo = ({ children }: IChildren) => {
  const [charactersList, setCharactersList] = useState<CharacterSchema[]>([]);

  let navigate = useNavigate();

  const { page } = useParams();
  console.log(page);

  useEffect(() => {
    api
      .get(`/characters?page=${page}`)
      .then((res) => {
        setCharactersList(res.data.data);
        window.localStorage.setItem("lastPage", String(page));
        return res;
      })
      .catch((err) => console.error(err));
  }, [page]);

  const nextPage = () => {
    navigate(`/2`);
  };

  const prevPage = () => {
    navigate(`/1`);
  };

  return (
    <GetAllCharactersContext.Provider value={{ charactersList, nextPage, prevPage }}>
      {children}
    </GetAllCharactersContext.Provider>
  );
};

AllRoutes.tsx:

const AllRoutes = () => {
  return (
    <Routes>
      <Route path="/" element={<Navigate to="/1" />} />
      <Route path="/:page" element={<Home />} />
      <Route path="*" element={<Home />} />
    </Routes>
  );
};

export default AllRoutes;

Index.tsx:

    import React from "react";
    import ReactDOM from "react-dom/client";
    import App from "./App";
    import { BrowserRouter } from "react-router-dom";
    import Providers from "./contexts/Providers";
    
    const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
    root.render(
      <React.StrictMode>
        <BrowserRouter>
          <Providers>
            <App />
          </Providers>
        </BrowserRouter>
      </React.StrictMode>
    );

推荐答案

拥有这个<Route path="/:page" element={<Home />} />将允许您使用page,而useParams只在Home中使用,这是Route为这个特定的URL呈现的组件.

完成你想要的东西的一种方法是将取回的部分移到Home内.为此,将获取和更新状态的函数作为上下文的一部分导出:

// import what's needed
export const GetAllCharactersContext = createContext<IGetAllCharacters>({} as IGetAllCharacters);
export const GetAllCharactersInfo = ({ children }: IChildren) => {
  const [charactersList, setCharactersList] = useState<CharacterSchema[]>([]);
  const navigate = useNavigate();
  
  const fetchCharactersList = useCallback((page) => {
    api
      .get(`/characters?page=${page}`)
      .then((res) => {
        setCharactersList(res.data.data);
        window.localStorage.setItem("lastPage", String(page));
      })
      .catch((err) => console.error(err));
  }, []);


  const nextPage = () => {
    navigate(`/2`);
  };

  const prevPage = () => {
    navigate(`/1`);
  };

  return (
    <GetAllCharactersContext.Provider value={{ charactersList, fetchCharactersList, nextPage, prevPage }}>
      {children}
    </GetAllCharactersContext.Provider>
  );
};

然后把你在供应商里的useEffect转移到Home里面.大概是这样的:

// import what's needed
export default function Home() {
  const { fetchCharactersList, charactersList } = useContext(GetAllCharactersInfo);
  const { page } = useParams();

  useEffect(() => {
    if (!page) return;
    fetchCharactersList(page);
  }, [page]);

  // render data
  return <div></div>;
}

Javascript相关问答推荐

如何将特定的字符串类型转换为TypScript中的字符串?

以逗号分隔的列表来数组并填充收件箱列表

如何避免使用ajax在Vue 3合成API中重定向

创建1:1比例元素,以另一个元素为中心

如何编辑代码FlipDown.js倒计时?

无法将nPM simplex-noise包导入在JS项目中工作

为什么getRecord()会因为与_logger相关的错误而失败?(使用Hedera SDK)

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

网页自检测外部元素无法加载

如何在Javascript中的控制台上以一行形式打印循环的结果

WebGL 2.0无符号整数输入变量

使用JQuery单击元素从新弹出窗口获取值

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

WhatsApp Cloud API上载问题:由于MIME类型不正确而导致接收&Quot;INVALID_REQUEST";错误

禁用.js文件扩展名并从目录导入隐式根index.js时,找不到NodeJS导入模块

为什么我的自定义元素没有被垃圾回收?

如何使用TypeScrip设置唯一属性?

基于产品ID更新条带产品图像的JavaScript命中错误

在JS/TS中将复杂图形转换为数组或其他数据 struct

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色