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

React组件挂载时window.innerWidth为何为undefined?仅resize后正常

问题解决:React窗口宽度初始值undefined的问题

核心原因

你代码里的初始状态赋值存在拼写错误:window.innerwidth应该是window.innerWidth(注意W是大写)。这个错误导致初始状态读取了一个不存在的属性,所以width一开始是undefined,只有窗口调整时触发事件才会设置正确的值。

修正后的代码

const [width, setWidth] = useState(window.innerWidth); // 修正拼写错误
useEffect(() => {
    const handleResizeWindow = () => setWidth(window.innerWidth);
    // 监听窗口 resize 事件
    window.addEventListener("resize", handleResizeWindow);
    // 组件卸载时移除监听
    return () => {
        window.removeEventListener("resize", handleResizeWindow);
    };
}, [])
useEffect(() => {
    if (width >= 900) {
        dispatch(setView('trip'))
    }
    console.log(width)
}, [width])

额外优化建议

如果你的应用涉及服务端渲染(SSR),直接访问window会报错(服务端环境没有window对象),可以改成以下写法避免报错:

// 初始值判断是否存在window对象,不存在则设为默认值0
const [width, setWidth] = useState(typeof window !== 'undefined' ? window.innerWidth : 0);

另外,也可以在第一个useEffect里主动调用一次handleResizeWindow,确保初始状态绝对同步当前窗口宽度:

useEffect(() => {
    const handleResizeWindow = () => setWidth(window.innerWidth);
    window.addEventListener("resize", handleResizeWindow);
    handleResizeWindow(); // 初始触发一次,同步宽度
    return () => {
        window.removeEventListener("resize", handleResizeWindow);
    };
}, [])

修正后,你的条件渲染代码就能在首次加载时正常工作了:

return (
    <>
      {width < 900 && <MobileNavbar />}
    </>
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:18:36