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

NextJS+MobX环境下切换元素className不生效问题求助

解决NextJS + MobX切换className不生效的问题

问题根源

你的代码存在三个关键问题:

  1. CSS Modules 使用错误:直接写原始类名(如'isChosen')无法匹配CSS Modules生成的唯一类名,必须通过导入的styles对象调用对应属性。
  2. 模板字符串语法错误:第二个写法里的{styles.isChosen}多套了一层大括号,属于语法错误。
  3. MobX响应式未生效:组件未用MobX的observer包裹,导致store状态变化时组件不会重新渲染。

修正后的完整代码

1. Example.tsx(核心修正)

import { observer } from 'mobx-react-lite'; // 导入observer
import styles from './Example.module.scss'; // 导入CSS Modules样式
import exampleStore from './ExampleStore';

// 用observer包裹组件,确保状态变化触发重渲染
const Example = observer(() => {
  return (
    <div 
      className={exampleStore.isChosen ? styles.isChosen : styles.isNotChosen}
      onClick={() => {
        exampleStore.isChosen = !exampleStore.isChosen;
      }}
    >ELEMENT</div>
  );
});

export default Example;

2. ExampleStore.ts(无需修改,但确保MobX配置正确)

import { observable } from 'mobx';

class ExampleStore {
  @observable
  isChosen: boolean = false;
}

// 单例导出store
const exampleStore = new ExampleStore();
export default exampleStore;

3. Example.module.scss(保持不变)

.isChosen{
  background-color: red;
}

.isNotChosen{
  background-color: blue;
}

额外注意事项

  • 确保已安装必要依赖:mobx、mobx-react-lite(用于函数组件)或mobx-react(用于类组件)。
  • 如果是类组件,需要用@observer装饰器包裹组件类,而非函数式的observer高阶组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:02:02