Skip to content

Commit 66a88bc

Browse files
fix(use-composable): add size work when onMounted is done (#175)
1 parent 5a2ebc0 commit 66a88bc

File tree

1 file changed

+45
-43
lines changed

1 file changed

+45
-43
lines changed

packages/core/use-composable/src/useSize.ts

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/// <reference types="resize-observer-browser" />
22

33
import type { Ref, WatchStopHandle } from 'vue'
4-
import { onUnmounted, ref, watch } from 'vue'
4+
import { onMounted, onUnmounted, ref, watch } from 'vue'
55

66
interface Size {
77
width: number
@@ -13,59 +13,61 @@ function useSize(element: Ref<HTMLElement | null>) {
1313
let stopHandle: WatchStopHandle
1414
let resizeObserver: ResizeObserver
1515

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 }
1920

20-
resizeObserver = new ResizeObserver((entries) => {
21-
if (!Array.isArray(entries))
22-
return
21+
resizeObserver = new ResizeObserver((entries) => {
22+
if (!Array.isArray(entries))
23+
return
2324

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
2829

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
3233

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
4640
}
4741
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+
}
5052
}
51-
}
5253

53-
size.value = { width, height }
54-
})
54+
size.value = { width, height }
55+
})
5556

56-
resizeObserver.observe(element.value)
57+
resizeObserver.observe(element.value)
5758

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)
6162

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+
})
6971
})
7072

7173
onUnmounted(() => {

0 commit comments

Comments
 (0)