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

为什么MUI styled创建的AppBar组件状态变化时样式不更新?

问题根因

MUI v5 的 styled 工具默认会自动过滤非标准 HTML 属性,你自定义的 scrollNav 没有被显式标记为需要透传的属性,导致样式计算函数始终拿不到更新后的 scrollNav 状态值,因此样式不会触发变更。
另外你当前的滚动事件监听没有配置卸载逻辑,组件销毁后会残留事件回调引发内存泄漏。

修复方案

1. 调整 styled 组件配置,透传自定义属性

首先从 MUI 样式工具中导入 defaultShouldForwardProp,配置自定义属性透传规则:

import { styled, defaultShouldForwardProp } from '@mui/material/styles';
import MUIAppBar from '@mui/material/AppBar';

const AppBar = styled(MUIAppBar, {
  // 显式指定scrollNav需要透传到样式计算函数
  shouldForwardProp: (prop) => 
    prop === 'scrollNav' || defaultShouldForwardProp(prop)
})(({ theme, scrollNav }) => ({
  // 无特殊需求不需要加!important,MUI自定义样式优先级默认足够覆盖内置样式
  backgroundColor: scrollNav ? 'red' : '#E6EEF4',
  position: 'fixed',
  color: '#232F3D',
  paddingTop: theme.spacing(2),
  paddingBottom: theme.spacing(2),
}))

2. 补全滚动事件的卸载逻辑

修改 useEffect 代码,添加销毁回调:

const [scrollNav, setScrollNav] = useState(false)

useEffect(() => {
  const changeNav = () => {
    setScrollNav(window.scrollY >= 96)
  }
  window.addEventListener('scroll', changeNav)
  // 组件卸载时移除事件监听
  return () => window.removeEventListener('scroll', changeNav)
}, [])

3. 组件调用逻辑无需调整

原有传参方式可以正常使用:

<AppBar position="fixed" scrollNav={scrollNav}></AppBar>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:06:04