forked from vueComponent/ant-design-vue
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseMediaQuery.ts
80 lines (75 loc) · 1.84 KB
/
useMediaQuery.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { ref } from 'vue';
export const MediaQueryEnum = {
xs: {
maxWidth: 575,
matchMedia: '(max-width: 575px)',
},
sm: {
minWidth: 576,
maxWidth: 767,
matchMedia: '(min-width: 576px) and (max-width: 767px)',
},
md: {
minWidth: 768,
maxWidth: 991,
matchMedia: '(min-width: 768px) and (max-width: 991px)',
},
lg: {
minWidth: 992,
maxWidth: 1199,
matchMedia: '(min-width: 992px) and (max-width: 1199px)',
},
xl: {
minWidth: 1200,
maxWidth: 1599,
matchMedia: '(min-width: 1200px) and (max-width: 1599px)',
},
xxl: {
minWidth: 1600,
matchMedia: '(min-width: 1600px)',
},
xxxl: {
minWidth: 2000,
matchMedia: '(min-width: 2000px)',
},
};
export type MediaQueryKey = keyof typeof MediaQueryEnum;
/**
* loop query screen className
* Array.find will throw a error
* `Rendered more hooks than during the previous render.`
* So should use Array.forEach
*/
export const getScreenClassName = () => {
let className: MediaQueryKey = 'md';
// support ssr
if (typeof window === 'undefined') {
return className;
}
const mediaQueryKey = (Object.keys(MediaQueryEnum) as MediaQueryKey[]).find(key => {
const { matchMedia } = MediaQueryEnum[key];
if (window.matchMedia(matchMedia).matches) {
return true;
}
return false;
});
className = mediaQueryKey as unknown as MediaQueryKey;
return className;
};
const useMedia = () => {
const colSpan = ref(getScreenClassName());
(Object.keys(MediaQueryEnum) as MediaQueryKey[]).forEach(key => {
const { matchMedia } = MediaQueryEnum[key];
const mediaQuery = window.matchMedia(matchMedia);
if (mediaQuery.matches) {
colSpan.value = key;
}
mediaQuery.onchange = e => {
if (e.matches) {
colSpan.value = key;
}
};
});
return colSpan;
};
export default useMedia;