如何在React中检测屏幕大小是否已更改为移动设备?

Emb*_*ugs 20 reactjs responsive

我正在使用React开发一个Web应用程序,需要检测屏幕大小何时进入移动断点才能更改状态.具体来说,当用户进入移动模式并且使用存储在组件内状态的布尔值控制时,我需要将sidenav折叠.

小智 41

我所做的是在组件安装后添加一个事件监听器:

componentDidMount() {
    window.addEventListener("resize", this.resize.bind(this));
    this.resize();
}

resize() {
    this.setState({hideNav: window.innerWidth <= 760});
}
Run Code Online (Sandbox Code Playgroud)

编辑:为了保存状态更新,我稍微更改了"调整大小",只是在需要时进行更新.

resize() {
    let currentHideNav = (window.innerWidth <= 760);
    if (currentHideNav !== this.state.hideNav) {
        this.setState({hideNav: currentHideNav});
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你会想要去抖动或扼杀那个事件监听器.你会找到[这里]的两个例子(https://remysharp.com/2010/07/21/throttling-function-calls). (3认同)

Ble*_*ing 9

在 React(16.8.0+) 中使用钩子参考https : //stackoverflow.com/a/36862446/1075499

import { useState, useEffect } from 'react';

function getWindowDimensions() {
  const { innerWidth: width, innerHeight: height } = window;
  return {
    width,
    height
  };
}

export default function useWindowDimensions() {
  const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());

  useEffect(() => {
    function handleResize() {
      setWindowDimensions(getWindowDimensions());
    }

    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return windowDimensions;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是另一个答案的复制粘贴:/sf/answers/2580371251/ 请使用不属于自己的解决方案的参考 (3认同)

Mun*_*eeb 8

这与@Ben Cohen 的回答相同,但在将您的函数附加到 eventListner 后,还要在componentWillUnmount上将其删除

constructor() {
  super();
  this.state = { screenWidth: null };
  this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}

componentDidMount() {
    window.addEventListener("resize", this.updateWindowDimensions());
}

componentWillUnmount() {
    window.removeEventListener("resize", this.updateWindowDimensions)
}

updateWindowDimensions() {
   this.setState({ screenWidth: window.innerWidth });
}
Run Code Online (Sandbox Code Playgroud)


小智 7

const [isMobile, setIsMobile] = useState(false)
 
//choose the screen size 
const handleResize = () => {
  if (window.innerWidth < 720) {
      setIsMobile(true)
  } else {
      setIsMobile(false)
  }
}

// create an event listener
useEffect(() => {
  window.addEventListener("resize", handleResize)
})

// finally you can render components conditionally if isMobile is True or False 
Run Code Online (Sandbox Code Playgroud)