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

react-material-ui-carousel接入React Router后尺寸异常过小如何修复?

问题描述

我想要实现适配MUI组件的轮播功能,找到了react-material-ui-carousel组件使用,但遇到了显示异常问题,不确定是否是我的操作有误。

以下是我单独运行时可以正常工作的代码:

import React from 'react'
import Carousel from 'react-material-ui-carousel'
import { Card } from '@mui/material'
import CardMedia from '@mui/material/CardMedia';
import CityA from "./Images/CityA.jpg"
import CityB from "./Images/CityB.jpg"

function Item(props)
{
    return (
        <Card sx={{ width: "50%"}}>
          <CardMedia
        component="img"
        height="25%"
        image={props.item.img}
      />
        </Card>
    )
}

function Home() {

  var items = [
    {
        img: CityA
    },
    {
      img: CityB
    }
  ]

    return (
     <Carousel >
            {items.map( (item, i) => <Item key={i} item={item} />)}
     </Carousel>
    )
}

export default Home

以上代码单独运行时效果正常,但当我将该组件作为路由页面接入React Router后,显示完全异常,相关代码如下:

import React, { useEffect, useState } from "react";
import {BrowserRouter as Router, Routes, Route } from "react-router-dom"
import Header from "./Header";
import Home from "./Home";

function App() {
  return (
    <div className="app">
    <Router>
        <Routes>
          <Route path = "/" element={<Header/>}>
            <Route path = "/" element = {<Home/>} />
          </Route>
        </Routes>
    </Router>
  </div>
  );
}

export default App;

接入路由后轮播尺寸变得极小,即使放大500%也无法正常查看,我期望实现适配MUI的正常轮播效果。


问题原因
  1. React Router v6的嵌套路由规则要求,父路由对应的组件必须渲染<Outlet />组件才能加载子路由的内容,你使用的<Header />作为父路由组件没有添加<Outlet />,导致子路由<Home />的渲染容器没有正常的宽高基准,百分比单位无法正常计算。
  2. 你给CardMedia设置的height: "25%"是相对父元素的百分比高度,父容器Card没有设置固定高度的前提下,百分比高度会直接塌陷,导致内容尺寸异常。
解决方案

步骤1:修改Header组件,添加Outlet

在Header组件的合适位置引入并渲染<Outlet />,用来承载子路由的内容:

import { Outlet } from 'react-router-dom'
// 你的其他Header相关导入

export default function Header() {
  return (
    <>
      {/* 你的原有Header导航、标题等代码 */}
      <Outlet />
    </>
  )
}

步骤2:修正轮播组件的尺寸设置

将相对单位替换为有明确基准的尺寸值,比如给CardMedia设置固定高度,或者给外层Carousel设置固定高度:

function Item(props)
{
    return (
        <Card sx={{ width: "50%", margin: "0 auto" }}>
          <CardMedia
            component="img"
            height="200" // 替换为固定像素值
            image={props.item.img}
            alt="轮播图片"
          />
        </Card>
    )
}

// 也可以给外层Carousel设置高度
function Home() {
  // 原有代码
  return (
    <Carousel sx={{ height: "60vh" }}>
      {items.map( (item, i) => <Item key={i} item={item} />)}
    </Carousel>
  )
}
其他适配MUI的轮播实现方案
  • 可以使用MUI官方生态的SwipeableViews结合MobileStepper组件自定义轮播,适配性更高
  • 可以选择mui-carousel组件,是专门针对MUI设计的轮播组件,API更贴合MUI的设计规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:10