实现一个 useMediaQuery
Hook,用于订阅并响应媒体查询的变化(例如屏幕大小、分辨率、方向等)。
export default function Component() {const isSmallDevice = useMediaQuery('only screen and (max-width: 768px)');return <div>{isSmallDevice && <a href="#">Menu</a>}</div>;}
提示:window.matchMedia
API 可能会有所帮助。
query: string
:要匹配的媒体查询。它必须是有效的 CSS 媒体查询字符串该 Hook 返回一个布尔值,指示媒体查询是否匹配。
实现一个 useMediaQuery
Hook,用于订阅并响应媒体查询的变化(例如屏幕大小、分辨率、方向等)。
export default function Component() {const isSmallDevice = useMediaQuery('only screen and (max-width: 768px)');return <div>{isSmallDevice && <a href="#">Menu</a>}</div>;}
提示:window.matchMedia
API 可能会有所帮助。
query: string
:要匹配的媒体查询。它必须是有效的 CSS 媒体查询字符串该 Hook 返回一个布尔值,指示媒体查询是否匹配。
window.matchMedia(query)
是一个 JavaScript 方法,用于检查文档是否与给定的 CSS 媒体查询匹配。它返回一个 MediaQueryList
对象,该对象提供:
.matches
(布尔值):指示文档当前是否与媒体查询匹配.addEventListener("change", callback)
:侦听媒体查询匹配状态的变化.removeEventListener("change", callback)
:在不再需要时删除事件侦听器例子:
const mediaQuery = window.matchMedia('(max-width: 768px)');if (mediaQuery.matches) {console.log('视口为 768px 或更小');}mediaQuery.addEventListener('change', (e) => {console.log(e.matches ? '现在是小屏幕' : '现在是大屏幕');});
useMediaQuery
是一个 hook,它允许 React 应用程序利用此浏览器 API 并响应媒体变化(例如屏幕大小、分辨率、方向等)。
useEffect
和 useState
可以使用 useState
hook 存储当前的媒体查询匹配项,并使用 useEffect
hook 在媒体查询更改时更新匹配项来实现 useMediaQuery
hook。我们可以将侦听器附加到 window.matchMedia(...)
返回的 MediaQueryList
对象上的 change
事件 以更新匹配状态。
import { useEffect, useState } from 'react';export default function useMediaQuery(query: string): boolean {const [matches, setMatches] = useState(() => window.matchMedia(query).matches,);useEffect(() => {const mediaQueryList = window.matchMedia(query);function updateMatch() {setMatches(mediaQueryList.matches);}mediaQueryList.addEventListener('change', updateMatch);return () => {mediaQueryList.removeEventListener('change', updateMatch);};}, [query]);return matches;}
useSyncExternalStore
React 的 useSyncExternalStore
hook 更好,因为它旨在将 React 状态与外部系统同步,例如订阅原生浏览器 API。
import { useCallback, useSyncExternalStore } from 'react';export default function useMediaQuery(query: string): boolean {const subscribe = useCallback((callback: () => void) => {const mediaQueryList = window.matchMedia(query);mediaQueryList.addEventListener('change', callback);return () => {mediaQueryList.removeEventListener('change', callback);};},[query],);return useSyncExternalStore(subscribe,() => window.matchMedia(query).matches,);}
console.log()
语句将显示在此处。