我正在try 使用react router dom v6组织我的routes应用程序,因此当我想通过点击ProductPage组件内的"添加到购物车"按钮来访问CartPage组件时,我会看到一个空页面,没有我在CartPage组件上生成的预期信息.我的代码如下:

the ProductPage code:

import React from "react";
import {Link, useParams, useNavigate} from "react-router-dom";
import Rating from "../components/Rating";
import {useSelector, useDispatch} from "react-redux";
import {useEffect, useState} from "react";
import {detailsProduct} from "../actions/productAction";
import LoadingBox from "../components/LoadingBox";
import ErrorBox from "../components/ErrorBox";

function ProductPage (props) {
    const dispatch = useDispatch();
    const { id } = useParams();
    useEffect(()=> {
     dispatch(detailsProduct(id));  

    }, [dispatch, id]);
    const [qty, setQty] = useState(1);
    const productDetails = useSelector((state) => state.productDetails);
    const {loading, error, product} = productDetails;
    console.log(product);
    
    const navigate = useNavigate(); 
    
    const addToCartHandler = () => {
        

        navigate(`/cart/${id}?qty= ${qty}`)
    }

            
    return (
            <div>
        {
            loading ?( <LoadingBox> </LoadingBox>) : error ?( <ErrorBox variant="danger" >{error}</ErrorBox>): (  <div>
        <Link to="/" >Back to result</Link>
           <div className="row top" >
             <div className="col-2" >
             <img className="large" src={product.images} alt={product.name} />
             </div>
             <div className="col-1" >
             <ul>
               <li>
                <h1>{product.name}</h1>
               </li>
               <li>
                <Rating rating={product.rating} numReviews={product.numReviews} ></Rating>
               </li>
               <li>
                Price: ${product.price}
               </li>
               <li>
                Description:
                <p>{product.description}</p>
               </li>
             </ul>
             </div>
             <div className="col-1" >
               <div className="card card-body" >
                    <ul>
                        
                        <li>
                          <div className="row">
                            <div>Price</div>
                            <div className="price">${product.price}</div>
                          </div>
                         </li>
                         <li>
                          <div className="row">
                            <div>Status</div>
                            <div>
                            {product.countInStock > 0 ? (<span className="success" >In stock</span>): (
                            <span className="danger">Unvailable</span>) }
                            </div>
                          </div>
                         </li>
                         {product.countInStock > 0 && (
                            <>
                            <li>
                              <div className="row" >
                               <div>Qty</div>
                               <div>
                                <select value={qty} onChange={e=> setQty(e.target.value)} >
                                {
                                  [...Array(product.countInStock).keys()].map(x=> 
                                  <option key={x + 1} value={x + 1} >{x + 1} </option>
                                  )}
                                </select>
                               </div>
                              </div>
                            </li>
                              <li> <button onClick={addToCartHandler} className="primary block" >Add to Cart</button> </li> 
                            </>
                            
                            )}
                            </ul>
               </div>
             </div>
           </div>

        </div> )}
                </div>
        
    )

};
export default ProductPage;
CartPage code:
import React from "react";
import {useParams, useSearchParams} from "react-router-dom";

const CartPage = (props) => {
    const {id} = useParams();
    const [searchParams] = useSearchParams();
    const qty = searchParams('qty');
    console.log(qty)
    return (
        <div>
          <h1>Cart Page</h1>
          <p>Add to cart : ProductId : {id} Qty: {qty}</p>
        </div>
    )
};
export default CartPage;
App.js code:
import React from "react";
import HomePage from "./pages/HomePage"
import {BrowserRouter, Routes, Route} from "react-router-dom";
import ProductPage from "./pages/ProductPage";
import CartPage from "./pages/CartPage";

function App() {
  return (
    <BrowserRouter>
    <div className="grid-container">
      <header className="row" >
        <div>
          <a href="/" className="brand" >MyShop</a>
        </div>
        <div>
          <a href="/cart">Cart</a>
          <a href="/signin">Sign In </a>
        </div>
      </header>
      <main>
      
       <Routes>
       <Route path="/cart/:id?" element={<CartPage />} />
          <Route path="/" element={<HomePage />} />
          <Route path="/product/:id" element={<ProductPage />} /> 
        </Routes>
        
    <div>
       
      </div>
      </main>
      <footer className="row center" >
        All right reserved
      </footer>
    </div>
    </BrowserRouter>
  );
}

export default App;

推荐答案

我可以看到一些小问题.

  1. 购物车路由路径错误地包含尾随的"?"个字符.把它拿走.尾随的"?"是找不到路由的原因.

    <Route path="/cart/:id" element={<CartPage />} />
    
  2. Cart组件未正确使用searchParams对象.必须使用.get方法才能访问queryString参数的值.

    const qty = searchParams.get("qty");
    
  3. 计算购物车链接中有一个空间.把它拿走.

    const addToCartHandler = () => {
      navigate(`/cart/${id}?qty=${qty}`);
    };
    

Edit no-routes-matched-location-cart-2qty-201-react-router-dom-v6

Javascript相关问答推荐

React状态变量在使用++前置更新时引发错误

我的YouTube视频没有以html形式显示,以获取免费加密信号

将json数组项转换为js中的扁平

Vue:ref不会创建react 性属性

如何解决CORS政策的问题

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

浮动Div的淡出模糊效果

如何修复(或忽略)HTML模板中的TypeScript错误?'

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

Chart.js-显示值应该在其中的引用区域

将核心模块导入另一个组件模块时存在多个主题

类构造函数不能在没有用With Router包装的情况下调用

Eval vs函数()返回语义

确保函数签名中的类型安全:匹配值

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

我在哪里添加过滤器值到这个函数?

为什么当雪碧的S在另一个函数中时,Phaser不能加载它?

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题