Skip to content

Commit d0b87d9

Browse files
antfusxzz
authored andcommitted
test: add more test
1 parent f8c2df7 commit d0b87d9

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
@@ -130,7 +130,7 @@ export const ssrTransformModel: DirectiveTransform = (dir, node, context) => {
130130
checkDuplicatedValue()
131131
node.children = [createInterpolation(model, model.loc)]
132132
} else if (node.tag === 'dialog' || node.tag === 'details') {
133-
res.props = [createObjectProperty(`open`, model)]
133+
res.props = [createObjectProperty('open', model)]
134134
} else if (node.tag === 'select') {
135135
node.children.forEach(option => {
136136
if (option.type === NodeTypes.ELEMENT) {

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

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

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

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

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)