APP.JSimport/App.css';从"导入{BrowserRouter as Router,Routes,Route,Navigate};反应路由器dom";;import Home from"/pages/Home";;import Login from"/pages/Login";;import Register from"/pages/Register";;从"导入BookingCar/pages/BookingCar";;导入";antd/dist/antd.css">
function App() {
return (
<Router>
<Routes>
<Route path='/' element={<Home/>}/>
<Route path="/login" element={<Login/>}></Route>
<Route path="/register" element={<Register />}></Route>
<Route path="/booking/:id" element={<BookingCar />}></Route>
</Routes>
</Router>
);}
导出默认应用程序;
BookingCar.js
import React, {useState,useEffect} from "react";
import { useDispatch, useSelector } from "react-redux";
import { getAllcars } from "../redux/action/carsAction";
import { useParams } from 'react-router-dom';
import Spinner from "../components/Spinner";
import DefaultLayout from "../components/DefaultLayout";
import { Row, Col} from "antd";
export default function BookingCar({match}){
const { carid } = useParams();
const {cars} = useSelector(state => state.carsReducer)
const {loading} = useSelector(state => state.alertReducer)
const [car, setcar] = useState({})
const dispatch = useDispatch()
useEffect(() => {
dispatch(getAllcars())
if(cars.length>0){
setcar(cars.find(o=>o._id === carid))
}
}, [cars])
return(
<DefaultLayout>
{loading && (<Spinner/> )}
<Row>
<Col lg={10} sm={24} xs={24}>
<img alt=""src={car.image} className="carimg"/>
</Col>
</Row>
</DefaultLayout>
)
}
Home.js
import React, {useState,useEffect} from "react";
import { useDispatch, useSelector } from "react-redux";
import DefaultLayout from "../components/DefaultLayout";
import { getAllcars } from "../redux/action/carsAction";
import { Button, Row, Col} from "antd";
import {Link} from "react-router-dom";
import Spinner from "../components/Spinner";
export default function Home(){
const {cars} = useSelector(state => state.carsReducer)
const {loading} = useSelector(state => state.alertReducer)
const dispatch = useDispatch()
useEffect(() => {
dispatch(getAllcars())
}, [])
return(
<DefaultLayout>
{loading === true && (<Spinner/> )}
<Row justify="center" gutter={16} className="mt-5">
{cars.map(car=>{
return <Col lg={5} sm={24} xs={24}>
<div className="car p-2 bs1 ">
<img alt=""src={car.image} className="carimg"/>
<div className="car-content d-flex align-items-center justify-content-between">
<div>
<p>{car.name}</p>
<p>{car.rentPerHour} Rent Per Hour</p>
</div>
<div>
<button className="btn1 mt-2"><Link to={`/booking/${car._id}`}>Book now </Link></button>
</div>
</div>
</div>
</Col>
})}
</Row>
</DefaultLayout>
)
}在BookingCar.js中,我试图获取汽车的详细信息,如id(图像(,但我遇到了错误所以请帮我解决这个问题
您正试图在car
加载/应用到状态之前访问它。在尝试使用之前,先检查它是否存在
{car && (
<Row>
<Col lg={10} sm={24} xs={24}>
<img alt=""src={car.image} className="carimg"/>
</Col>
</Row>
)}
carid
未定义,因为它不是已定义的路由参数(path="/booking/:id"
(,所以.find
函数返回undefined
。
您有有效的car
初始状态
const [car, setcar] = useState({});
所以您应该能够从car
中销毁(car.image
&<img alt=""src={car.image} className="carimg"/>
(而不会出现问题。稍后通过cardid
路由参数筛选cars
时会出现此问题。
useEffect(() => {
dispatch(getAllcars());
if (cars.length > 0) {
setcar(cars.find(o => o._id === carid));
}
}, [cars]);
如果找不到匹配项,array.find
可能会返回undefined
,因此UI应该对此进行处理。路由匹配参数也是始终字符串,因此如果_id
字段不是"string"
类型,则严格相等将不起作用。尝试通过转换为字符串来进行类型安全比较。
cars.find(o => String(o._id) === carid)
return (
<DefaultLayout>
{loading && <Spinner />}
{car && (
<Row>
<Col lg={10} sm={24} xs={24}>
<img alt=""src={car.image} className="carimg" />
</Col>
</Row>
)}
</DefaultLayout>
);
最后,将路由匹配参数定义为":id"
,但在组件中销毁一个carid
。确保匹配参数匹配。
如果路线为:
<Route path="/booking/:id" element={<BookingCar />} />
使用const { id } = useParams();
否则,更新路由参数以匹配代码:
<Route path="/booking/:carid" element={<BookingCar />} />
使用const { carid } = useParams();