我在Reaction路由上遇到了一个非常奇怪和复杂的问题.我正在try 实现一个具有不同页面数量的单页面应用程序,该页面数量取决于json文件中的产品数量. 在我的应用程序中,我的主页面总是只有一个页面,因此它只有一个参数,称为:节.只有当我使用第二个参数:PAGE_NUMBER时,我才会遇到这个错误,所有其他页面都有这个参数.

这是我的主要组件,它包含各种页面,并取决于路由参数

import { Routes, Route } from 'react-router-dom';
import GoodsList from './GoodsList';
import Pages from './Pages';

function Sections() {
    return (
        <Routes>
            <Route path='' element={<>
                <div className="pageContent" data-main="true">
                    <p>Novelties</p>
                    <GoodsList goods="novelties" />
                    <p>Hot</p>
                    <GoodsList goods="hot" />
                </div>
            </>} />
            <Route path='/:section/:page_number' element={<>
                <div className='pageContent'>
                    <GoodsList />
                    <Pages />
                </div>
            </>} />
        </Routes>
    )

我用来在页面上导航的这个组件

import { Link } from 'react-router-dom';

function Menu() {
    return (
        <nav className='menu'>
            <ul>
                <li>
                    <Link to="">Main</Link>
                </li>
                <li>
                    <Link to="figures/1">Figures</Link>
                </li>
                <li>
                    <Link to="dakimakuras/1">Figures</Link>
                </li>
                <li>
                    <Link to="manga/1">Manga</Link>
                </li>
                <li>
                    <Link to="other/1">Other merch</Link>
                </li>
            </ul>
        </nav>
    )
}

最后,该组件显示产品列表

import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchProducts } from '../redux/fetchDataReducer';
import { useParams } from 'react-router-dom';

function GoodsList(props) {
    const params = useParams();
    const goods = returnGoods();
    function returnGoods() {
        if (document.location.pathname == "/") {
            return props.goods
        }
        return params.section
    }
    
    const dispatch = useDispatch();
    useEffect(() => {
        dispatch(fetchProducts());
    }, [])
    
    const products = useSelector(state => state.fetchDataReducer.products);
    
    return (
        <div className="list">
            {products && products[goods].map((good, i) => (
                <div className="productCard" key={i}>
                    <div className="productPicture">
                        <img src={good.pic} alt="ERROR" />
                    </div>
                    <p className="productName">{good.name}</p>
                </div>
            ))}
        </div>
    )
}

问题是,当我点击导航栏中的主页,或者通过在地址栏中输入路径直接移动到主页时,它总是运行良好.然后,如果我点击导航栏中的任何部分,一切都运行得很好,但如果我try 刷新页面或通过直接在栏中键入地址来移动到除Main以外的任何页面,GoodsList组件将不会加载产品列表.数据的获取不会以某种方式发生,但是组件本身和地址栏中的所有参数都可以很好地加载.但是,如果我将再次移动到主页,然后通过使用导航链接移动到任何其他部分,它将再次加载正常,问题不会出现,直到我刷新页面.

因此,只有当我有:PAGE_NUMBER参数并且只影响我通过Redux从json文件接收的数据时,问题才会出现.如果我删除第二个参数,错误就不会发生.当我直接使用此参数移动到任何部分或刷新页面时,都会发生这种情况,如果我使用菜单栏上的导航链接,它工作得很好,但前提是我在此之前访问了主页.

UPD.添加Pages组件

import { useSelector } from "react-redux";
import { Link, useParams } from 'react-router-dom';

function Pages() {
    const params = useParams();
    const products = useSelector(state => state.fetchDataReducer.products);
    const currentProduct = products ? products[params.section] : [];
    const pageLinks = [];

    let numberOfPages = () => {
        if ((currentProduct.length / 8) % 1 == 0) {
            return currentProduct.length / 8
        }
        else return Math.floor((currentProduct.length / 8) + 1)
    }

    for (let x = 1; x < (numberOfPages() + 1); x++) {
        pageLinks.push(<Link to={`/${params.section}/${x}`} className="pageLink" key={x}>{x}</Link>);
    }
    
    return (
        <div className="pageList">
            {pageLinks}
        </div>
    )
}

UPD.Codesandbox示例 https://codesandbox.io/p/github/TheDanieLSh/React-Sites/draft/modest-hopper?layout=%257B%2522sidebarPanel%2522%253A%2522EXPLORER%2522%252C%2522rootPanelGroup%2522%253A%257B%2522direction%2522%253A%2522horizontal%2522%252C%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522id%2522%253A%2522ROOT_LAYOUT%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522panelType%2522%253A%2522TABS%2522%252C%2522id%2522%253A%2522cli1ipbjf00iu356lorpxfmbk%2522%257D%255D%252C%2522sizes%2522%253A%255B100%255D%257D%252C%2522tabbedPanels%2522%253A%257B%2522cli1ipbjf00iu356lorpxfmbk%2522%253A%257B%2522tabs%2522%253A%255B%257B%2522id%2522%253A%2522cli1ipbje00it356lhcqi48gt%2522%252C%2522mode%2522%253A%2522permanent%2522%252C%2522type%2522%253A%2522FILE%2522%252C%2522filepath%2522%253A%2522%252F.gitignore%2522%257D%255D%252C%2522id%2522%253A%2522cli1ipbjf00iu356lorpxfmbk%2522%252C%2522activeTabId%2522%253A%2522cli1ipbje00it356lhcqi48gt%2522%257D%257D%252C%2522showDevtools%2522%253Atrue%252C%2522showSidebar%2522%253Atrue%252C%2522sidebarPanelSize%2522%253A15%257D

推荐答案

fetchProducts操作对它从"/public"目录获取/加载的products.json文件使用103资源路径.

fetch("products.json")

当应用程序当前位于根"/"路由上时,这很好地工作,并且正如预期的那样,当IS调度fetchProducts时呈现GoodsList组件.products.json资源被请求105到当前URL路径,例如"/products.json",并且数据被加载到Redux存储中而没有问题.

在导航到子路由例如"/:section/:page_number"之后,现在请求products.json文件104that路径,例如在公共目录中不存在的"/figures/1/products".当用户在子路由上并重新加载页面时,获取操作就会失败.只要用户至少(eventually)登录到主"/"页面,这就很好,因此当请求发出时,它实际上是成功的.

要进行解析,只需将101资源路径指定为"/products.json"即可.

fetch("/products.json")
export const fetchProducts = createAsyncThunk(
  "dataFetch/fetchProducts",
  async () => {
    const response = await fetch("/products.json");
    const data = await response.json();
    return data;
  }
);

Edit data-fetching-not-happening-when-i-use-two-parameters-in-react-router-dom-and-na

Reactjs相关问答推荐

在react中向数组状态添加值时出错

react 表复选框不对任何操作做出react

从Microsoft Excel粘贴复制的单元格时,将Excel单元格格式(粗体、下划线、斜体)带入Reaction

如何访问子集合中的文档?

React中的useEffect钩子

对搜索引擎优化来说,react 头盔的异步足够了吗?

未定义发送的数据无法在reactjs中找到原因

如何修复ReferenceError:在构建过程中未定义导航器

无法在 NextJS 中获取嵌套对象

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

我无法通过 useContext 显示值

我发送的 prop 的值不会改变.如果成功登录,导航栏中的 prop 必须为 true.我从后端得到 200 ok

useRef 不关注模态

React中的功能性组件克隆优化

文本的几个词具有线性渐变 colored颜色 - React native

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

如何在 MUI 数据网格中的 renderCell 组件之间传递状态

setState 改变对象引用

如何在 react-router-dom v6 中实现监听功能?

为什么我从另一个组件收到错误?