Skip to content

Commit 70d8092

Browse files
authored
fix(useVModel): unified value (#1568)
1 parent 620931c commit 70d8092

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

packages/core/useVModel/index.test.ts

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,32 +105,54 @@ describe('useVModel', () => {
105105
})
106106

107107
it('should work with user define defaultValue', () => {
108-
const props = {
108+
const props: Record<string, unknown> = {
109109
...defaultProps(),
110-
data: undefined as string | undefined,
111110
a: 0,
112111
b: '',
113112
c: false,
113+
d: null,
114+
e: undefined,
114115
}
115116
const emitMock = vitest.fn()
116117

117118
const data = useVModel(props, 'data', emitMock, { defaultValue: 'default-data' })
118-
const dataA = useVModel(props, 'a', emitMock)
119-
const dataB = useVModel(props, 'b', emitMock)
120-
const dataC = useVModel(props, 'c', emitMock)
119+
const dataA = useVModel(props, 'a', emitMock, { defaultValue: 'default-data' })
120+
const dataB = useVModel(props, 'b', emitMock, { defaultValue: 'default-data' })
121+
const dataC = useVModel(props, 'c', emitMock, { defaultValue: 'default-data' })
122+
const dataD = useVModel(props, 'd', emitMock, { defaultValue: 'default-data' })
123+
const dataE = useVModel(props, 'e', emitMock, { defaultValue: 'default-data' })
121124

122125
expect(data.value).toBe('default-data')
123126
expect(dataA.value).toBe(0)
124127
expect(dataB.value).toBe('')
125128
expect(dataC.value).toBe(false)
129+
expect(dataD.value).toBe(null)
130+
expect(dataE.value).toBe('default-data')
126131
})
127132

128133
it('should work with user define defaultValue with passive', () => {
129-
const props = {
134+
const props: Record<string, unknown> = {
130135
...defaultProps(),
136+
a: 0,
137+
b: '',
138+
c: false,
139+
d: null as string | null,
140+
e: undefined as string | undefined,
131141
}
132142
const emitMock = vitest.fn()
133-
const data = useVModel(props, 'data', emitMock, { passive: true, defaultValue: 'default-data' })
143+
144+
const data = useVModel(props, 'data', emitMock, { defaultValue: 'default-data', passive: true })
145+
const dataA = useVModel(props, 'a', emitMock, { defaultValue: 'default-data', passive: true })
146+
const dataB = useVModel(props, 'b', emitMock, { defaultValue: 'default-data', passive: true })
147+
const dataC = useVModel(props, 'c', emitMock, { defaultValue: 'default-data', passive: true })
148+
const dataD = useVModel(props, 'd', emitMock, { defaultValue: 'default-data', passive: true })
149+
const dataE = useVModel(props, 'e', emitMock, { defaultValue: 'default-data', passive: true })
150+
134151
expect(data.value).toBe('default-data')
152+
expect(dataA.value).toBe(0)
153+
expect(dataB.value).toBe('')
154+
expect(dataC.value).toBe(false)
155+
expect(dataD.value).toBe(null)
156+
expect(dataE.value).toBe('default-data')
135157
})
136158
})

packages/core/useVModel/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ export function useVModel<P extends object, K extends keyof P, Name extends stri
7070

7171
event = eventName || event || `update:${key}`
7272

73+
const getValue = () => isDef(props[key!]) ? props[key!] : defaultValue
74+
7375
if (passive) {
74-
const proxy = ref<P[K]>(props[key!] ?? defaultValue!)
76+
const proxy = ref<P[K]>(getValue()!)
7577

7678
watch(() => props[key!], v => proxy.value = v as UnwrapRef<P[K]>)
7779

@@ -87,7 +89,7 @@ export function useVModel<P extends object, K extends keyof P, Name extends stri
8789
else {
8890
return computed<P[K]>({
8991
get() {
90-
return isDef(props[key!]) ? props[key!] : defaultValue!
92+
return getValue()!
9193
},
9294
set(value) {
9395
_emit(event, value)

0 commit comments

Comments
 (0)