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

如何修复返回空白页面的Axios单电影请求问题?

问题解决:React Router v6单条电影数据加载空白

核心原因

React Router v6 不再自动给路由组件传递 match、location 这类props,你的Movie组件还在依赖props.match.params.id拿路由参数,导致根本取不到电影ID,API请求失败后页面一直停在Loading状态。

修复步骤

1. 用useParams替换props.match

修改Movie组件,改用React Router v6提供的useParams钩子获取路由参数:

import React, { useState, useEffect } from "react";
import MovieDataService from '../services/MovieDataService';
import Container from 'react-bootstrap/Container';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import Card from '@mui/material/Card';
import CardContent from '@mui/material/CardContent';
import CardMedia from '@mui/material/CardMedia';
import Typography from '@mui/material/Typography';
import { CardActionArea } from '@mui/material';
import { Link, useParams } from "react-router-dom"; // 引入useParams

const Movie = ({ user }) => { // 只接收需要的user参数
  const { id } = useParams(); // 直接获取路由里的id
  const [movie, setMovie] = useState({
    _id: null,
    title: "",
    rated: "",
    plot: "",
    poster: ""
  });

  useEffect(() => {
    const fetchMovie = async () => {
      try {
        const response = await MovieDataService.get(id);
        setMovie(response.data);
        console.log(response.data);
      } catch (error) {
        console.error('Error fetching movie:', error);
      }
    };

    if (id) { // 有id就发起请求
      fetchMovie();
    }
  }, [id]); // 依赖项改成id

  if (!movie.title) {
    return (
      <Container className="Firstset">
        <div>Loading...</div>
      </Container>
    );
  }

  return (
    <Container className="Firstset">
      <Row>
        <Col key={movie._id} xs={12} sm={12} md={6} lg={3}>
          <Card sx={{ maxWidth: 345 }}>
            <CardActionArea>
              <CardMedia
                component="img"
                height="345"
                image={movie.poster ? movie.poster + "/345x300" : ""}
                alt={movie.title}
              />
              <CardContent>
                <Typography gutterBottom variant="h5" component="div">
                  {movie.title}
                </Typography>
                <Typography variant="body2" color="text.secondary">
                  Rated: {movie.rated}
                </Typography>
                <Typography variant="body2" color="text.secondary">
                  Plot: {movie.plot}
                </Typography>
                <Link to={`/movies/${id}/review`}>Add A review</Link> {/* 这里也用拿到的id */}
              </CardContent>
            </CardActionArea>
          </Card>
        </Col>
      </Row>
    </Container>
  );
};

export default Movie;

2. 路由配置保持原样

你的路由写法是对的,不需要修改:

<Route path="/movies/:id/" element={<Movie user={user} />} />

3. 处理控制台警告

控制台提示的Movie prop警告,大概率是某个DOM元素上不小心传了大写的Movie属性(比如拼写错误把movie写成了Movie),找到对应的代码改成小写或者直接移除这个属性就行。

验证效果

修改后访问/movies/[电影ID],组件会正确拿到路由参数,调用API获取数据并渲染电影卡片,不会再出现空白页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:49:56