Skip to content

Commit 0cc198c

Browse files
committed
test: add more test
1 parent 6080cf1 commit 0cc198c

File tree

3 files changed

+88
-6
lines changed

3 files changed

+88
-6
lines changed

packages/compiler-ssr/src/transforms/ssrVModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export const ssrTransformModel: DirectiveTransform = (dir, node, context) => {
129129
checkDuplicatedValue()
130130
node.children = [createInterpolation(model, model.loc)]
131131
} else if (node.tag === 'dialog' || node.tag === 'details') {
132-
res.props = [createObjectProperty(`open`, model)]
132+
res.props = [createObjectProperty('open', model)]
133133
} else if (node.tag === 'select') {
134134
// NOOP
135135
// select relies on client-side directive to set initial selected state.

packages/runtime-dom/__tests__/directives/vModel.spec.ts

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
ref
1111
} from '@vue/runtime-dom'
1212

13-
const triggerEvent = (type: string, el: Element) => {
14-
const event = new Event(type)
13+
const triggerEvent = (type: string, el: Element, arg?: any) => {
14+
const event = new Event(type, arg)
1515
el.dispatchEvent(event)
1616
}
1717

@@ -1173,4 +1173,82 @@ describe('vModel', () => {
11731173
await nextTick()
11741174
expect(data.value).toEqual('使用拼音输入')
11751175
})
1176+
1177+
it('should work with details', async () => {
1178+
const manualListener = vi.fn()
1179+
const component = defineComponent({
1180+
data() {
1181+
return { value: false }
1182+
},
1183+
render() {
1184+
return [
1185+
withVModel(
1186+
h('details', {
1187+
'onUpdate:modelValue': setValue.bind(this),
1188+
onToggle: () => {
1189+
manualListener(data.value)
1190+
}
1191+
}),
1192+
this.value
1193+
)
1194+
]
1195+
}
1196+
})
1197+
render(h(component), root)
1198+
1199+
const details = root.querySelector('details')! as HTMLDetailsElement
1200+
const data = root._vnode.component.data
1201+
expect(details.open).toEqual(false)
1202+
1203+
details.open = true
1204+
triggerEvent('toggle', details, { target: details })
1205+
await nextTick()
1206+
expect(data.value).toEqual(true)
1207+
expect(manualListener).toHaveBeenCalledWith(true)
1208+
1209+
data.value = false
1210+
await nextTick()
1211+
expect(details.open).toEqual(false)
1212+
1213+
data.value = true
1214+
await nextTick()
1215+
expect(details.open).toEqual(true)
1216+
})
1217+
1218+
it('should work with dialog', async () => {
1219+
const manualListener = vi.fn()
1220+
const component = defineComponent({
1221+
data() {
1222+
return { value: false }
1223+
},
1224+
render() {
1225+
return [
1226+
withVModel(
1227+
h('dialog', {
1228+
'onUpdate:modelValue': setValue.bind(this),
1229+
onClose: () => {
1230+
manualListener(data.value)
1231+
}
1232+
}),
1233+
this.value
1234+
)
1235+
]
1236+
}
1237+
})
1238+
render(h(component), root)
1239+
1240+
const dialog = root.querySelector('dialog')! as HTMLDialogElement
1241+
const data = root._vnode.component.data
1242+
expect(dialog.open).toEqual(false)
1243+
1244+
data.value = true
1245+
await nextTick()
1246+
expect(dialog.open).toEqual(true)
1247+
1248+
dialog.open = false
1249+
triggerEvent('close', dialog)
1250+
await nextTick()
1251+
expect(data.value).toEqual(false)
1252+
expect(manualListener).toHaveBeenCalledWith(false)
1253+
})
11761254
})

packages/runtime-dom/src/directives/vModel.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,15 @@ export const vModelSelect: ModelDirective<HTMLSelectElement> = {
212212

213213
export const vModelDetails: ModelDirective<HTMLDetailsElement> = {
214214
created(el, _, vnode) {
215+
el._assign = getModelAssigner(vnode)
215216
addEventListener(el, 'toggle', () => {
216217
el._assign(el.open)
217218
})
218-
el._assign = getModelAssigner(vnode)
219219
},
220220
mounted(el, { value }) {
221221
el.open = value
222222
},
223-
beforeUpdate(el, _binding, vnode) {
223+
beforeUpdate(el, _, vnode) {
224224
el._assign = getModelAssigner(vnode)
225225
},
226226
updated(el, { value }) {
@@ -238,7 +238,7 @@ export const vModelDialog: ModelDirective<HTMLDialogElement> = {
238238
mounted(el, { value }) {
239239
el.open = value
240240
},
241-
beforeUpdate(el, _binding, vnode) {
241+
beforeUpdate(el, _, vnode) {
242242
el._assign = getModelAssigner(vnode)
243243
},
244244
updated(el, { value }) {
@@ -314,6 +314,10 @@ function resolveDynamicModel(tagName: string, type: string | undefined) {
314314
return vModelSelect
315315
case 'TEXTAREA':
316316
return vModelText
317+
case 'DETAILS':
318+
return vModelDetails
319+
case 'DIALOG':
320+
return vModelDialog
317321
default:
318322
switch (type) {
319323
case 'checkbox':

0 commit comments

Comments
 (0)