useMediaQuery
信息
在功能组件中以编程方式测试和监控媒体查询
1.实现
import { useState, useCallback, useEffect } from 'react';
const useMediaQuery = (queries = [], values = [], defaultValue) => {
const mediaQueryList = queries.map(q => window.matchMedia(q));
const getValue = useCallback(() => {
const index = mediaQueryList.findIndex(mql => mql.matches);
return typeof values[index] !== 'undefined' ? values[index] : defaultValue;
}, [mediaQueryList, values, defaultValue]);
const [value, setValue] = useState(getValue);
useEffect(() => {
const handler = () => setValue(getValue);
mediaQueryList.forEach(mql => mql.addEventListener('change', handler));
return () =>
mediaQueryList.forEach(mql => mql.removeEventListener('change', handler));
}, [getValue, mediaQueryList]);
return value;
};
export default useMediaQuery;
2.使用
添加一个媒体查询来检查设备是否允许用户悬停在元素上。这样,如果用户可以悬停或应用基本样式,就可以添加特定的不透明样式。
import { useMediaQuery } from "./hooks";
function App() {
const canHover = useMediaQuery(
// Media queries
["(hover: hover)"],
// Values corresponding to the above media queries by array index
[true],
// Default value
false
);
const canHoverClass = "opacity-0 hover:opacity-100 transition-opacity";
const defaultClass = "opacity-100";
return (
<div className={canHover ? canHoverClass : defaultClass}>Hover me!</div>
);
}
export default App;