8000 fix(useMediaQuery): only add/remove event listeners on query change (… · vueuse/vueuse@f39691f · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit f39691f

Browse files
Ingramzantfu
andauthored
fix(useMediaQuery): only add/remove event listeners on query change (#3236)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
1 parent 5309c26 commit f39691f

File tree

3 files changed

+33
-20
lines changed

3 files changed

+33
-20
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"build:redirects": "esno scripts/redirects.ts",
1212
"build:rollup": "NODE_OPTIONS=\"--max-old-space-size=6144\" rollup -c",
1313
"build:types": "tsc --emitDeclarationOnly && nr types:fix",
14-
"clean": "rimraf dist types \"packages/*/dist\"",
14+
"clean": "rimraf --glob dist types \"packages/*/dist\"",
1515
"dev": "nr update && nr docs",
1616
"docs": "vue-demi-switch 3 && vitepress dev packages --open",
1717
"docs:build": "nr update:full && vitepress build packages && nr build:redirects && esno scripts/post-docs.ts",

packages/core/useMediaQuery/index.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { ref, watchEffect } from 'vue-demi'
44
import type { MaybeRefOrGetter } from '@vueuse/shared'
5-
import { toRef, tryOnScopeDispose } from '@vueuse/shared'
5+
import { toValue, tryOnScopeDispose } from '@vueuse/shared'
66
import type { ConfigurableWindow } from '../_configurable'
77
import { defaultWindow } from '../_configurable'
88
import { useSupported } from '../useSupported'
@@ -21,39 +21,42 @@ export function useMediaQuery(query: MaybeRefOrGetter<string>, options: Configur
2121
let mediaQuery: MediaQueryList | undefined
2222
const matches = ref(false)
2323

24+
const handler = (event: MediaQueryListEvent) => {
25+
matches.value = event.matches
26+
}
27+
2428
const cleanup = () => {
2529
if (!mediaQuery)
2630
return
2731
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)
3033
else
3134
// @ts-expect-error deprecated API
32-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
33-
mediaQuery.removeListener(update)
35+
mediaQuery.removeListener(handler)
3436
}
3537

36-
const update = () => {
38+
const stopWatch = watchEffect(() => {
3739
if (!isSupported.value)
3840
return
3941

4042
cleanup()
4143

42-
mediaQuery = window!.matchMedia(toRef(query).value)
43-
matches.value = !!mediaQuery?.matches
44-
45-
if (!mediaQuery)
46-
return
44+
mediaQuery = window!.matchMedia(toValue(query))
4745

4846
if ('addEventListener' in mediaQuery)
49-
mediaQuery.addEventListener('change', update)
47+
mediaQuery.addEventListener('change', handler)
5048
else
5149
// @ts-expect-error deprecated API
52-
mediaQuery.addListener(update)
53-
}
54-
watchEffect(update)
50+
mediaQuery.addListener(handler)
5551

56-
tryOnScopeDispose(() => cleanup())
52+
matches.value = mediaQuery.matches
53+
})
54+
55+
tryOnScopeDispose(() => {
56+
stopWatch()
57+
cleanup()
58+
mediaQuery = undefined
59+
})
5760

5861
return matches
5962
}

packages/core/useWindowSize/index.test.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,20 @@ import { useWindowSize } from '.'
44

55
describe('useWindowSize', () => {
66
const addEventListenerSpy = vi.spyOn(window, 'addEventListener')
7-
const matchMediaSpy = vi.spyOn(window, 'matchMedia')
7+
const matchMediaSpy = vi.spyOn(window, 'matchMedia').mockImplementation(query => ({
8+
matches: false,
9+
media: query,
10+
onchange: null,
11+
addListener: vi.fn(),
12+
removeListener: vi.fn(),
13+
addEventListener: vi.fn(),
14+
removeEventListener: vi.fn(),
15+
dispatchEvent: vi.fn(),
16+
}))
17+
818
beforeEach(() => {
9-
addEventListenerSpy.mockReset()
10-
matchMediaSpy.mockReset()
19+
addEventListenerSpy.mockClear()
20+
matchMediaSpy.mockClear()
1121
})
1222

1323
afterAll(() => {

0 commit comments

Comments
 (0)
0