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

React路由跳转后图片不显示问题求助(附代码)

问题描述

在CameraPage.tsx中已实现通过GET请求从后端获取摄像头图片的逻辑,功能运行正常。但用户点击InfoOutlineIcon跳转到CameraImages页面(对应CameraForm.tsx)时,控制台显示图片已加载,新页面却无法展示。经排查,跳转后新页面重新初始化,既未获取到之前加载的图片数据,也未重新发起请求,导致前端无图片显示。

解决方案

方案1:路由跳转时传递已加载数据

利用路由的state参数,在跳转时把已获取的图片数据传递给目标页面,避免重复发起请求。

方案2:目标页面独立发起请求

在CameraImages页面中,通过路由参数获取摄像头ID,重新发起请求获取图片数据,保证页面数据的独立性和新鲜度。

修改后的代码示例

方案1:路由传参实现

CameraPage.tsx 跳转逻辑修改

<InfoOutlineIcon
  onClick={async () => {
    const hasImage = await fetchCameraImage(camera.id, currentPageImages);
    if (hasImage) {
      // 跳转时携带图片数据、当前页码和摄像头ID
      routerAfterClickInfoCamera.push({
        pathname: 'CameraImages',
        state: {
          imageData: imageData,
          currentPageImages: currentPageImages,
          cameraId: camera.id
        }
      });
    }
  }}
/>

CameraForm.tsx 接收路由参数

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

const CameraImages: React.FC = () => {
  const location = useLocation();
  // 从路由state中获取数据,设置默认值避免空值报错
  const imageData = location.state?.imageData || [];
  const currentPageImages = location.state?.currentPageImages || 1;
  const imagesPerPage = 20;

  const [searchPlaca, setSearchPlaca] = useState("");

  // 原有过滤、分页逻辑保持不变...
  
  return (
    // 原有JSX结构保持不变...
  )
}

方案2:目标页面重新请求实现

CameraPage.tsx 跳转逻辑修改

<InfoOutlineIcon
  onClick={async () => {
    const hasImage = await fetchCameraImage(camera.id, currentPageImages);
    if (hasImage) {
      // 跳转时携带摄像头ID到路由参数
      routerAfterClickInfoCamera.push(`CameraImages/${camera.id}`);
    }
  }}
/>

CameraForm.tsx 新增请求逻辑

import { useParams } from 'react-router-dom';
import axios from 'axios';
import { useState, useEffect } from 'react';

export interface ImageData {
  imageURL: string;
  data: string;
  placa: string;
  score: number;
}

const CameraImages: React.FC = () => {
  const { cameraId } = useParams<{ cameraId: string }>();
  const [imageData, setImageData] = useState<ImageData[]>([]);
  const [currentPageImages, setCurrentPageImages] = useState(1);
  const imagesPerPage = 20;
  const [searchPlaca, setSearchPlaca] = useState("");
  const accessToken = localStorage.getItem('accessToken'); // 根据实际存储方式获取token
  const API_URL = process.env.REACT_APP_API_URL; // 替换为你的API地址

  // 新增图片请求函数
  const fetchCameraImage = async (cameraId: number, page: number): Promise<boolean> => {
    if (!accessToken) {
      console.log("Access token not found");
      return false;
    }

    try {
      const response = await axios.get(`${API_URL}/api/v1/imagens/pagination/${cameraId}?page=${page}&size=${imagesPerPage}`, {
        headers: {
          Authorization: `Bearer ${accessToken}`
        },
      });

      if (response.status === 200) {
        const images = response.data.items;
        const cameraImages = images.filter((image: any) => image.camera_id === cameraId);
        
        if (cameraImages.length > 0) {
          const formattedImages: ImageData[] = cameraImages.map((image: any) => ({
            imageURL: `data:image/jpg;base64,${image.image}`,
            data: image.data,
            placa: image.placa,
            score: image.score,
          }));
          setImageData(formattedImages);
          return true;
        } else {
          console.error("该摄像头暂无图片");
          return false;
        }
      } else {
        console.error("获取图片失败");
        return false;
      }
    } catch (error) {
      console.error("请求图片时出错", error);
      return false;
    }
  };

  // 页面加载时发起请求
  useEffect(() => {
    if (cameraId) {
      fetchCameraImage(parseInt(cameraId), currentPageImages);
    }
  }, [cameraId, currentPageImages]);

  // 原有过滤、分页逻辑保持不变...
  
  return (
    // 原有JSX结构保持不变...
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:17:48