为什么 useMediaQuery 在 React.js 中总是 return false
Why does useMediaQuery always return false in React.js
最近我遇到了来自“react-responsive”的 useMediaQuery 问题。
import { useMediaQuery } from 'react-responsive'
const TestComponent = () => {
const isDesktopOrLaptop = useMediaQuery({
query: '(min-width: 1440px)'
})
const isTablet = useMediaQuery({ query: '(min-width: 768px)' })
const isMobile = useMediaQuery({ query: '(max-width: 475px)' })
}
但是我记得去年我成功使用这个模块的时间但是现在这个 returns 总是错误的。
我不知道它发生了什么。
感谢您的所有建议。
我不熟悉 react-responsive
,但如果您不喜欢使用该库,MUI 提供了 same hook 并且它工作得很好。
如果您有兴趣自己动手,我还提供了一个自定义挂钩的代码,它同样有效(但功能少得多)。
All-in-one 外部图书馆:
useMediaQuery 来自 MUI。下面是一个监视 600px
屏幕尺寸的简单示例。
import * as React from 'react'
import useMediaQuery from '@mui/material/useMediaQuery'
export default function SimpleMediaQuery()
{
const matches = useMediaQuery('(min-width:600px)')
return <span>{`(min-width:600px) matches: ${matches}`}</span>
}
想改用预设断点吗?
const matches = useMediaQuery(theme.breakpoints.up('sm'))
回调?
const matches = useMediaQuery((theme) => theme.breakpoints.up('sm'))
可以通过多种方式自定义此挂钩(有关更多示例,请参阅上面链接的文档)。
没有外部库的自定义挂钩:
如果你想在不依赖外部库的情况下做到这一点,这里有一个简单的钩子,可以监视某些断点,类似于 MUI 的 useMediaQuery
。
export const useMediaQuery = (width) =>
{
const [targetReached, setTargetReached] = useState(false)
const updateTarget = useCallback((e) =>
{
if (e.matches) setTargetReached(true)
else setTargetReached(false)
}, [])
useEffect(() =>
{
const media = window.matchMedia(`(max-width: ${width}px)`)
media.addEventListener('change', updateTarget)
// Check on mount (callback is not called until a change occurs)
if (media.matches) setTargetReached(true)
return () => media.removeEventListener('change', updateTarget)
}, [])
return targetReached
}
用法:
// 600px
const matches = useMediaQuery(600)
希望你先检查一下你当前的react版本,如果你用的是旧版本,请更新到最新版本。我正在使用 React 18.0,它在我这边工作得很好。
希望对您有所帮助。
最近我遇到了来自“react-responsive”的 useMediaQuery 问题。
import { useMediaQuery } from 'react-responsive'
const TestComponent = () => {
const isDesktopOrLaptop = useMediaQuery({
query: '(min-width: 1440px)'
})
const isTablet = useMediaQuery({ query: '(min-width: 768px)' })
const isMobile = useMediaQuery({ query: '(max-width: 475px)' })
}
但是我记得去年我成功使用这个模块的时间但是现在这个 returns 总是错误的。
我不知道它发生了什么。
感谢您的所有建议。
我不熟悉 react-responsive
,但如果您不喜欢使用该库,MUI 提供了 same hook 并且它工作得很好。
如果您有兴趣自己动手,我还提供了一个自定义挂钩的代码,它同样有效(但功能少得多)。
All-in-one 外部图书馆:
useMediaQuery 来自 MUI。下面是一个监视 600px
屏幕尺寸的简单示例。
import * as React from 'react'
import useMediaQuery from '@mui/material/useMediaQuery'
export default function SimpleMediaQuery()
{
const matches = useMediaQuery('(min-width:600px)')
return <span>{`(min-width:600px) matches: ${matches}`}</span>
}
想改用预设断点吗?
const matches = useMediaQuery(theme.breakpoints.up('sm'))
回调?
const matches = useMediaQuery((theme) => theme.breakpoints.up('sm'))
可以通过多种方式自定义此挂钩(有关更多示例,请参阅上面链接的文档)。
没有外部库的自定义挂钩:
如果你想在不依赖外部库的情况下做到这一点,这里有一个简单的钩子,可以监视某些断点,类似于 MUI 的 useMediaQuery
。
export const useMediaQuery = (width) =>
{
const [targetReached, setTargetReached] = useState(false)
const updateTarget = useCallback((e) =>
{
if (e.matches) setTargetReached(true)
else setTargetReached(false)
}, [])
useEffect(() =>
{
const media = window.matchMedia(`(max-width: ${width}px)`)
media.addEventListener('change', updateTarget)
// Check on mount (callback is not called until a change occurs)
if (media.matches) setTargetReached(true)
return () => media.removeEventListener('change', updateTarget)
}, [])
return targetReached
}
用法:
// 600px
const matches = useMediaQuery(600)
希望你先检查一下你当前的react版本,如果你用的是旧版本,请更新到最新版本。我正在使用 React 18.0,它在我这边工作得很好。 希望对您有所帮助。