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

使用React JS获取窗口宽度时返回值与实际尺寸不符该如何解决?

修复React自定义Hook获取窗口宽度异常问题

核心问题原因

  • 你误用了window.screen.width属性:该属性返回的是设备显示器的整体物理宽度,和浏览器窗口的实际大小无关,所以你调整窗口大小时数值不会变化,和预期不符。
  • useEffect依赖配置错误:你将widthWindow放入了依赖数组,每次setWidthWindow更新状态后都会重新触发useEffect执行,形成死循环,存在严重性能问题。
  • 自定义Hook未返回宽度值:当前代码执行后没有对外暴露宽度结果,业务组件无法拿到数值。

修复后完整代码

import React, { useState, useEffect } from 'react';

// 建议按React自定义Hook规范命名为use开头
const useWindowWidth = () => {
  // 初始化直接取当前视口宽度,避免初始值为null的异常
  const [windowWidth, setWindowWidth] = useState(window.innerWidth)
  
  const updateWidth = () => {
    // 如需获取不含滚动条的内容区域宽度,可替换为 document.documentElement.clientWidth
    setWindowWidth(window.innerWidth)
  }

  useEffect(() => {
    window.addEventListener('resize', updateWidth)
    // 组件卸载时移除事件监听,避免内存泄漏
    return () => window.removeEventListener('resize', updateWidth)
  }, []) // 依赖数组留空,仅在组件挂载/卸载时执行一次,不会重复触发

  // 返回实时窗口宽度供业务组件使用
  return windowWidth
}

export default useWindowWidth

调用示例

在需要用到窗口宽度的组件内直接调用Hook即可:

const MyComponent = () => {
  const currentWidth = useWindowWidth()
  return (
    <div>
      <p>当前窗口宽度为:{currentWidth}px</p>
      {/* 可根据宽度做响应式逻辑判断 */}
      {currentWidth < 768 ? <MobileView /> : <DesktopView />}
    </div>
  )
}

内容的提问来源于stack exchange,提问作者Fraza Aditya Wiguna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:15:03