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

react-router-dom v6报“No routes matched location /shopping-cart”问题求助

React Router DOM v6 路由参数与跳转问题

我是React Router DOM v6的新手,点击"加入购物车"按钮跳转时,链接带参数但路由匹配有问题,不知道怎么修复。

当前代码情况

路由配置(App.js)

import React from 'react';
import { Container } from 'react-bootstrap';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import HomeScreen from './screens/HomeScreen';
import ProductScreen from './screens/ProductScreen';
import ShoppingCartScreen from './screens/ShoppingCartScreen';

const App = () => {
  return (
    <Router>
      <Container>
        <Routes>
          <Route path='/' element={<HomeScreen />} exact />
          <Route path='/product/:id' element={<ProductScreen />} />
          <Route path='shopping-cart/:id?' element={<ShoppingCartScreen />} />
        </Routes>
      </Container>
    </Router>
  );
}

export default App;

ProductScreen 跳转逻辑

import React, { useState, useEffect } from 'react';
import { Link, useParams, useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux'
import { Button } from 'react-bootstrap';

const ProductScreen = () => {
  const [quantity, setQuantity] = useState(1)
  let params = useParams();
  let navigate = useNavigate()

  const addToCardHandler = () => {
    navigate(`/shopping-cart/${params.id}?quantity=${quantity}`)
  }

  return (
    <div>
      <Button 
        className='btn-success'
        type='button'
        onClick={addToCardHandler}
      > 
        Add to Cart 
      </Button>
    </div>
  )
}

Header 导航组件

import React from 'react';
import {Container, Navbar, Nav } from 'react-bootstrap';
import { LinkContainer } from 'react-router-bootstrap';

const Header = () => {
  return (
    <header>
      <Navbar expand='lg' variant='dark' bg='primary' collapseOnSelect>
        <Container>
          <LinkContainer to="/">
            <Navbar.Brand>Azakamede</Navbar.Brand>
          </LinkContainer>
          <Navbar.Toggle aria-controls="navbarScroll" />
          <Navbar.Collapse id="navbarScroll">
            <Nav
              className="me-auto my-2 my-lg-0"
              style={{ maxHeight: '100px' }}
              navbarScroll
            >
              <LinkContainer to="/">
                <Nav.Link><i className="fas fa-house"></i>Products</Nav.Link>
              </LinkContainer>
              <LinkContainer to="/shopping-cart">
                <Nav.Link ><i className='fas fa-shopping-cart'></i>Cart</Nav.Link>
              </LinkContainer>
              <LinkContainer to="/login">
                <Nav.Link ><i className="fas fa-user"></i>Login</Nav.Link>
              </LinkContainer>
            </Nav>
          </Navbar.Collapse>
        </Container>
      </Navbar> 
    </header>
  );
}

export default Header

ShoppingCartScreen 页面

import React from 'react'

const ShoppingCartScreen = () => {
  return (
    <div>
      <h1> My Cart </h1>
    </div>
  )
}

export default ShoppingCartScreen

我怀疑问题出在addToCardHandler函数里,之前在React Router DOM v5里我是这么写的:

const addToCardHandler = () => {
  history.push(`/shopping-cart/${params.id}?quantity=${quantity}`)
}

修复方案

1. 修正路由路径

首先你的购物车路由缺少开头的斜杠,应该改为:

<Route path='/shopping-cart/:id?' element={<ShoppingCartScreen />} />

路径必须以/开头,否则会被当成相对路径,导致匹配失败。

2. 优化跳转逻辑(两种可选方式)

方式一:保留路径参数+查询参数

跳转写法可以保持原逻辑,但确保路径正确:

const addToCardHandler = () => {
  navigate(`/shopping-cart/${params.id}?quantity=${quantity}`)
}

方式二:统一用查询参数(更灵活)

如果不需要把id放在路径里,可以简化路由为:

// App.js 路由修改
<Route path='/shopping-cart' element={<ShoppingCartScreen />} />

跳转逻辑改为:

const addToCardHandler = () => {
  navigate(`/shopping-cart?id=${params.id}&quantity=${quantity}`)
}

3. 在购物车页面获取参数

不管用哪种方式,都需要在ShoppingCartScreen中正确读取参数:

  • 如果是路径参数+查询参数:
import React from 'react'
import { useParams, useSearchParams } from 'react-router-dom';

const ShoppingCartScreen = () => {
  const { id } = useParams();
  const [searchParams] = useSearchParams();
  const quantity = searchParams.get('quantity');

  return (
    <div>
      <h1> My Cart </h1>
      {id && <p>商品ID: {id}, 数量: {quantity}</p>}
    </div>
  )
}

export default ShoppingCartScreen
  • 如果只用查询参数:
import React from 'react'
import { useSearchParams } from 'react-router-dom';

const ShoppingCartScreen = () => {
  const [searchParams] = useSearchParams();
  const productId = searchParams.get('id');
  const quantity = searchParams.get('quantity');

  return (
    <div>
      <h1> My Cart </h1>
      {productId && <p>商品ID: {productId}, 数量: {quantity}</p>}
    </div>
  )
}

export default ShoppingCartScreen

4. 确认导航链接匹配

Header中的LinkContainer to="/shopping-cart"是正确的,和修正后的路由路径一致,无需修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:16:10