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

React中.module.scss样式不生效?className显示undefined

问题:React中CSS Modules样式不生效且className显示undefined

我在React组件中导入了Sublayout.module.scss的样式,但使用时样式未生效,且对应的className在渲染后显示为undefined。

Sublayout.module.scss 代码

.pl-6 {
    padding-left: 6rem !important;
}
.pr-6 {
    padding-right: 6rem !important;
}
.pl-12 {
    padding-left: 12rem !important;
}
.pr-12 {
    padding-right: 12rem !important;
}

React组件代码

import { FC, ReactNode } from "react";
import { Grid } from "@payping/web-components";
import styles from "./Sublayout.module.scss";

interface Props {
  children?: ReactNode;
  className?: string;
}

export const SubLayout: FC<Props> = (props: Props) => {
  const { children, className } = props;
  const sizes = Grid.useBreakpoint();

  // TODO not sure about top and bottom padding
  if (sizes.xxl) {
    console.log("xxl screen");
    return <div className={`${styles.pr12} ${styles.pl12} w-100 ${className}`}>{children}</div>;
  }
  if (sizes.xl) {
    console.log("xl screen");
    return <div className={`${styles.pr6} ${styles.pl6}  ${className}`}>{children}</div>;
  }
  if (sizes.lg) {
    console.log("lg screen");
    return <div className={`pr-3 pl-3 w-100 ${className}`}>{children}</div>;
  }
  if (sizes.md) {
    console.log("md screen");
    return <div className={`pr-2 pl-2 w-100 ${className}`}>{children}</div>;
  }
  if (sizes.sm) {
    console.log("sm screen");
    return <div className={`pr-1 pl-1 pe-10 ps-10 w-100 ${className}`}>{children}</div>;
  }
  if (sizes.xs) {
    console.log("xs screen");
    return <div className={`pr-1 pl-1 w-100 ${className}`}>{children}</div>;
  }

  return <div className={`ps-6 pe-6 w-100 ${className}`}>{children}</div>;
};

问题原因及修复方案

1. 类名不匹配(核心问题)

CSS Modules中,SCSS里的**短横线命名类(kebab-case)**在导入的styles对象中,对应的属性名是带短横线的字符串,无法通过驼峰式(比如styles.pr12)直接访问。你代码中使用的styles.pr12、styles.pl12、styles.pr6、styles.pl6都是不存在的属性,所以会返回undefined。

修复方式二选一:

  • 方式一:使用字符串索引访问类名
    把组件中对应的类名访问改成带短横线的字符串形式:

    // xxl屏幕分支
    return <div className={`${styles['pr-12']} ${styles['pl-12']} w-100 ${className}`}>{children}</div>;
    // xl屏幕分支
    return <div className={`${styles['pr-6']} ${styles['pl-6']} ${className}`}>{children}</div>;
    
  • 方式二:修改SCSS类名为驼峰式
    把SCSS中的类名改成和组件中使用的一致的驼峰式:

    .pl6 {
        padding-left: 6rem !important;
    }
    .pr6 {
        padding-right: 6rem !important;
    }
    .pl12 {
        padding-left: 12rem !important;
    }
    .pr12 {
        padding-right: 12rem !important;
    }
    

2. 处理className为undefined的情况

当父组件没有传入className时,拼接字符串会导致最终的className中出现undefined字样,建议用数组过滤后拼接:

// 以xxl分支为例
return (
  <div className={[styles['pr-12'], styles['pl-12'], 'w-100', className].filter(Boolean).join(' ')}>
    {children}
  </div>
);

filter(Boolean)会自动移除数组中的undefined、null等值,避免无效的className。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:35:11