如何检测 React 中的屏幕尺寸是否已更改为移动设备?
How to detect if screen size has changed to mobile in React?
我正在用 React 开发一个网络应用程序,需要检测屏幕尺寸何时进入移动断点以更改状态。
具体来说,我需要在用户进入移动模式时折叠我的 sidenav,这由存储在组件状态中的布尔值控制。
我所做的是在组件挂载后添加一个事件监听器:
componentDidMount() {
window.addEventListener("resize", this.resize.bind(this));
this.resize();
}
resize() {
this.setState({hideNav: window.innerWidth <= 760});
}
componentWillUnmount() {
window.removeEventListener("resize", this.resize.bind(this));
}
编辑:
为了保存状态更新,我稍微更改了“调整大小”,仅在 window 宽度发生变化时才更新。
resize() {
let currentHideNav = (window.innerWidth <= 760);
if (currentHideNav !== this.state.hideNav) {
this.setState({hideNav: currentHideNav});
}
}
更新:是时候使用钩子了!
如果你的组件是功能性的,并且你使用钩子 - 那么你可以使用 useMediaQuery
钩子,来自 react-responsive
包。
import { useMediaQuery } from 'react-responsive';
...
const isMobile = useMediaQuery({ query: `(max-width: 760px)` });
使用此钩子后,“isMobile”将在屏幕调整大小时更新,并重新渲染组件。好多了!
嘿,我刚刚针对这个问题发布了一个 npm 包。
看看https://www.npmjs.com/package/react-getscreen
import React, { Component } from 'react';
import {withGetScreen} from 'react-getscreen'
class Test extends Component {
render() {
if (this.props.isMobile()) return <div>Mobile</div>;
if (this.props.isTablet()) return <div>Tablet</div>;
return <div>Desktop</div>;
}
}
export default withGetScreen(Test);
//or you may set your own breakpoints by providing an options object
const options = {mobileLimit: 500, tabletLimit: 800}
export default withGetScreen(Test, options);
这与 相同,但在将您的函数附加到事件侦听器之后,还要在 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 });
}
有多种存档方法,第一种方法是 CSS 使用 class
@media screen and (max-width: 576px) {}
此标签内的任何 class 仅在屏幕等于或小于 576px 时可见
第二种方式是使用事件监听器
像这样
constructor(props)
{
super(props);
this.state = {
isToggle: null
}
this.resizeScreen = this.resizeScreen.bind(this);
}
componentDidMount() {
window.addEventListener("resize", this.resizeScreen());
}
resizeScreen() {
if(window.innerWidth === 576)
{
this.setState({isToggle:'I was resized'});
}
}
即使使用事件侦听器,我仍然更喜欢 CSS 方式,因为我们可以使用多种屏幕尺寸而无需进一步的 js 编码。
希望对您有所帮助!
Using hooks in React(16.8.0+)参考:
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;
}
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
在功能组件中,我们可以通过useTheme 和useMediaQuery 检测屏幕大小。
const theme = useTheme();
const xs = useMediaQuery(theme.breakpoints.only('xs'));
const sm = useMediaQuery(theme.breakpoints.only('sm'));
const md = useMediaQuery(theme.breakpoints.only('md'));
const lg = useMediaQuery(theme.breakpoints.only('lg'));
const xl = useMediaQuery(theme.breakpoints.only('xl'));
react-screentype-hook 库允许您开箱即用。
https://www.npmjs.com/package/react-screentype-hook
您可以使用它提供的默认断点,如下所示
const screenType = useScreenType();
screenType 具有以下形状
{
isLargeDesktop: Boolean,
isDesktop: Boolean,
isMobile: Boolean,
isTablet: Boolean
}
或者您甚至可以像这样配置您的自定义断点
const screenType = useScreenType({
mobile: 400,
tablet: 800,
desktop: 1000,
largeDesktop: 1600
});
我正在用 React 开发一个网络应用程序,需要检测屏幕尺寸何时进入移动断点以更改状态。
具体来说,我需要在用户进入移动模式时折叠我的 sidenav,这由存储在组件状态中的布尔值控制。
我所做的是在组件挂载后添加一个事件监听器:
componentDidMount() {
window.addEventListener("resize", this.resize.bind(this));
this.resize();
}
resize() {
this.setState({hideNav: window.innerWidth <= 760});
}
componentWillUnmount() {
window.removeEventListener("resize", this.resize.bind(this));
}
编辑: 为了保存状态更新,我稍微更改了“调整大小”,仅在 window 宽度发生变化时才更新。
resize() {
let currentHideNav = (window.innerWidth <= 760);
if (currentHideNav !== this.state.hideNav) {
this.setState({hideNav: currentHideNav});
}
}
更新:是时候使用钩子了!
如果你的组件是功能性的,并且你使用钩子 - 那么你可以使用 useMediaQuery
钩子,来自 react-responsive
包。
import { useMediaQuery } from 'react-responsive';
...
const isMobile = useMediaQuery({ query: `(max-width: 760px)` });
使用此钩子后,“isMobile”将在屏幕调整大小时更新,并重新渲染组件。好多了!
嘿,我刚刚针对这个问题发布了一个 npm 包。 看看https://www.npmjs.com/package/react-getscreen
import React, { Component } from 'react';
import {withGetScreen} from 'react-getscreen'
class Test extends Component {
render() {
if (this.props.isMobile()) return <div>Mobile</div>;
if (this.props.isTablet()) return <div>Tablet</div>;
return <div>Desktop</div>;
}
}
export default withGetScreen(Test);
//or you may set your own breakpoints by providing an options object
const options = {mobileLimit: 500, tabletLimit: 800}
export default withGetScreen(Test, options);
这与
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 });
}
有多种存档方法,第一种方法是 CSS 使用 class
@media screen and (max-width: 576px) {}
此标签内的任何 class 仅在屏幕等于或小于 576px 时可见
第二种方式是使用事件监听器
像这样
constructor(props)
{
super(props);
this.state = {
isToggle: null
}
this.resizeScreen = this.resizeScreen.bind(this);
}
componentDidMount() {
window.addEventListener("resize", this.resizeScreen());
}
resizeScreen() {
if(window.innerWidth === 576)
{
this.setState({isToggle:'I was resized'});
}
}
即使使用事件侦听器,我仍然更喜欢 CSS 方式,因为我们可以使用多种屏幕尺寸而无需进一步的 js 编码。
希望对您有所帮助!
Using hooks in React(16.8.0+)参考:
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;
}
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
在功能组件中,我们可以通过useTheme 和useMediaQuery 检测屏幕大小。
const theme = useTheme();
const xs = useMediaQuery(theme.breakpoints.only('xs'));
const sm = useMediaQuery(theme.breakpoints.only('sm'));
const md = useMediaQuery(theme.breakpoints.only('md'));
const lg = useMediaQuery(theme.breakpoints.only('lg'));
const xl = useMediaQuery(theme.breakpoints.only('xl'));
react-screentype-hook 库允许您开箱即用。 https://www.npmjs.com/package/react-screentype-hook
您可以使用它提供的默认断点,如下所示
const screenType = useScreenType();
screenType 具有以下形状
{
isLargeDesktop: Boolean,
isDesktop: Boolean,
isMobile: Boolean,
isTablet: Boolean
}
或者您甚至可以像这样配置您的自定义断点
const screenType = useScreenType({
mobile: 400,
tablet: 800,
desktop: 1000,
largeDesktop: 1600
});