2
2
3
3
import { ref , watchEffect } from 'vue-demi'
4
4
import type { MaybeRefOrGetter } from '@vueuse/shared'
5
- import { toRef , tryOnScopeDispose } from '@vueuse/shared'
5
+ import { toValue , tryOnScopeDispose } from '@vueuse/shared'
6
6
import type { ConfigurableWindow } from '../_configurable'
7
7
import { defaultWindow } from '../_configurable'
8
8
import { useSupported } from '../useSupported'
@@ -21,39 +21,42 @@ export function useMediaQuery(query: MaybeRefOrGetter<string>, options: Configur
21
21
let mediaQuery : MediaQueryList | undefined
22
22
const matches = ref ( false )
23
23
24
+ const handler = ( event : MediaQueryListEvent ) => {
25
+ matches . value = event . matches
26
+ }
27
+
24
28
const cleanup = ( ) => {
25
29
if ( ! mediaQuery )
26
30
return
27
31
if ( 'removeEventListener' in mediaQuery )
28
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
29
- mediaQuery . removeEventListener ( 'change' , update )
32
+ mediaQuery . removeEventListener ( 'change' , handler )
30
33
else
31
34
// @ts -expect-error deprecated API
32
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
33
- mediaQuery . removeListener ( update )
35
+ mediaQuery . removeListener ( handler )
34
36
}
35
37
36
- const update = ( ) => {
38
+ const stopWatch = watchEffect ( ( ) => {
37
39
if ( ! isSupported . value )
38
40
return
39
41
40
42
cleanup ( )
41
43
42
- mediaQuery = window ! . matchMedia ( toRef ( query ) . value )
43
- matches . value = ! ! mediaQuery ?. matches
44
-
45
- if ( ! mediaQuery )
46
- return
44
+ mediaQuery = window ! . matchMedia ( toValue ( query ) )
47
45
48
46
if ( 'addEventListener' in mediaQuery )
49
- mediaQuery . addEventListener ( 'change' , update )
47
+ mediaQuery . addEventListener ( 'change' , handler )
50
48
else
51
49
// @ts -expect-error deprecated API
52
- mediaQuery . addListener ( update )
53
- }
54
- watchEffect ( update )
50
+ mediaQuery . addListener ( handler )
55
51
56
- tryOnScopeDispose ( ( ) => cleanup ( ) )
52
+ matches . value = mediaQuery . matches
53
+ } )
54
+
55
+ tryOnScopeDispose ( ( ) => {
56
+ stopWatch ( )
57
+ cleanup ( )
58
+ mediaQuery = undefined
59
+ } )
57
60
58
61
return matches
59
62
}
0 commit comments