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

ReactJS MUI v5从withWidth迁移至useWidth的实现问题咨询

MUI v5 withWidth 迁移适配方案

适配步骤

  • 替换原有导入:将withWidth相关导入替换为 v5 提供的useWidthHook,注意 MUI v5 包名已统一从@material-ui/core更新为@mui/material
  • 组件内调用Hook获取宽度断点:直接在函数组件内部调用useWidth()即可获取当前宽度对应的断点值,原有isWidthUp判断逻辑可完全复用
  • 移除HOC包装:导出组件时不再需要withWidth()包裹,直接导出原生函数组件即可

完整修改后代码

import { Grid, GridList } from "@mui/material";
import { useWidth } from "@mui/material/useMediaQuery";
import { isWidthUp } from "@mui/material/styles";

import {
  ExtraTile,
  ExtraDiv,
  ExtraDescriptionText,
  ExtraPriceText,
} from "components/Extras/components/ExtraTiles";

import {
  SwitchExtra,
  SwitchExtraImage,
  SwitchTextDiv,
  SwitchDiv,
} from "components/Extras/components/SwitchExtraTiles";

function ExtraSwitchComponent(props) {
  // 调用useWidth获取当前宽度断点
  const width = useWidth();

  return (
    <GridList
      cellHeight={isWidthUp("md", width) ? 100 : 200}
      cols={1}
      spacing={0}
    >
      <ExtraTile
        style={{ cursor: "auto" }}
        key={props.type + "-tile"}
        cols={1}
        component="div"
      >
        <ExtraDiv>
          <Grid
            container
            direction="row"
            justifyContent="space-between"
            style={{ height: "100%" }}
          >
            <Grid
              item
              xs={isWidthUp("md", width) ? 4 : 12}
              style={{ height: isWidthUp("md", width) ? "100%" : "33%" }}
            >
              <SwitchExtraImage
                src={props.imageUrl}
                alt={props.imageAlt}
                topRight={isWidthUp("md", width) ? "0px" : "10px"}
                bottomLeft={isWidthUp("md", width) ? "10px" : "0px"}
              />
            </Grid>
            <Grid
              item
              xs={isWidthUp("md", width) ? 4 : 12}
              style={{ height: isWidthUp("md", width) ? "100%" : "33%" }}
            >
              <Grid
                container
                alignItems="center"
                style={{ height: "100%", width: "100%" }}
              >
                <Grid item xs={12} style={{ width: "100%", height: "50%" }}>
                  <ExtraDescriptionText>
                    {props.description}
                  </ExtraDescriptionText>
                </Grid>
                <Grid item xs={12} style={{ width: "100%", height: "50%" }}>
                  <ExtraPriceText>
                    {"+ " + props.price + props.priceDescriptor}
                  </ExtraPriceText>
                </Grid>
              </Grid>
            </Grid>
            <Grid
              item
              container
              xs={isWidthUp("md", width) ? 4 : 12}
              style={{ height: isWidthUp("md", width) ? "100%" : "33%" }}
              alignItems="center"
              justify="center"
              direction="column"
            >
              <SwitchExtra
                checked={props.selected}
                onChange={props.setSelected}
                color="primary"
              />
            </Grid>
          </Grid>
        </ExtraDiv>
      </ExtraTile>
    </GridList>
  );
}

// 移除withWidth HOC包装
export default ExtraSwitchComponent;

补充说明

MUI v5 中原GridList组件已更名为ImageList,如果需要长期维护建议同步替换该组件的导入和使用。如果你的项目临时保留了旧版@material-ui/core兼容包,也可以仅修改Hook相关的导入和调用逻辑,无需调整其他组件导入路径。


内容的提问来源于stack exchange,提问作者Pol Valls Ortiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:06:02