1
1
/// <reference types="resize-observer-browser" />
2
2
3
3
import type { Ref , WatchStopHandle } from 'vue'
4
- import { onUnmounted , ref , watch } from 'vue'
4
+ import { onMounted , onUnmounted , ref , watch } from 'vue'
5
5
6
6
interface Size {
7
7
width : number
@@ -13,59 +13,61 @@ function useSize(element: Ref<HTMLElement | null>) {
13
13
let stopHandle : WatchStopHandle
14
14
let resizeObserver : ResizeObserver
15
15
16
- watch ( element , ( ) => {
17
- if ( element . value ) {
18
- size . value = { width : element . value . offsetWidth , height : element . value . offsetHeight }
16
+ onMounted ( ( ) => {
17
+ watch ( element , ( ) => {
18
+ if ( element . value ) {
19
+ size . value = { width : element . value . offsetWidth , height : element . value . offsetHeight }
19
20
20
- resizeObserver = new ResizeObserver ( ( entries ) => {
21
- if ( ! Array . isArray ( entries ) )
22
- return
21
+ resizeObserver = new ResizeObserver ( ( entries ) => {
22
+ if ( ! Array . isArray ( entries ) )
23
+ return
23
24
24
- // Since we only observe the one element, we don't need to loop over the
25
- // array
26
- if ( ! entries . length )
27
- return
25
+ // Since we only observe the one element, we don't need to loop over the
26
+ // array
27
+ if ( ! entries . length )
28
+ return
28
29
29
- const entry = entries [ 0 ]
30
- let width : number
31
- let height : number
30
+ const entry = entries [ 0 ]
31
+ let width : number
32
+ let height : number
32
33
33
- if ( 'borderBoxSize' in entry ) {
34
- const borderSizeEntry = entry . borderBoxSize
35
- // iron out differences between browsers
36
- const borderSize = Array . isArray ( borderSizeEntry ) ? borderSizeEntry [ 0 ] : borderSizeEntry
37
- width = borderSize . inlineSize
38
- height = borderSize . blockSize
39
- }
40
- else {
41
- if ( element . value ) {
42
- // for browsers that don't support `borderBoxSize`
43
- // we calculate it ourselves to get the correct border box.
44
- width = element . value . offsetWidth
45
- height = element . value . offsetHeight
34
+ if ( 'borderBoxSize' in entry ) {
35
+ const borderSizeEntry = entry . borderBoxSize
36
+ // iron out differences between browsers
37
+ const borderSize = Array . isArray ( borderSizeEntry ) ? borderSizeEntry [ 0 ] : borderSizeEntry
38
+ width = borderSize . inlineSize
39
+ height = borderSize . blockSize
46
40
}
47
41
else {
48
- width = 0
49
- height = 0
42
+ if ( element . value ) {
43
+ // for browsers that don't support `borderBoxSize`
44
+ // we calculate it ourselves to get the correct border box.
45
+ width = element . value . offsetWidth
46
+ height = element . value . offsetHeight
47
+ }
48
+ else {
49
+ width = 0
50
+ height = 0
51
+ }
50
52
}
51
- }
52
53
53
- size . value = { width, height }
54
- } )
54
+ size . value = { width, height }
55
+ } )
55
56
56
- resizeObserver . observe ( element . value )
57
+ resizeObserver . observe ( element . value )
57
58
58
- stopHandle = watch ( element , ( newValue , oldValue ) => {
59
- if ( oldValue )
60
- resizeObserver . unobserve ( oldValue )
59
+ stopHandle = watch ( element , ( newValue , oldValue ) => {
60
+ if ( oldValue )
61
+ resizeObserver . unobserve ( oldValue )
61
62
62
- if ( newValue )
63
- resizeObserver . observe ( newValue )
64
- } )
65
- }
66
- else {
67
- size . value = undefined
68
- }
63
+ if ( newValue )
64
+ resizeObserver . observe ( newValue )
65
+ } )
66
+ }
67
+ else {
68
+ size . value = undefined
69
+ }
70
+ } )
69
71
} )
70
72
71
73
onUnmounted ( ( ) => {
0 commit comments