Skip to content

Commit 20a224a

Browse files
Fix state data attribute in Vue (#2787)
* Add tests * Fix state data attribute in Vue
1 parent 99cdf91 commit 20a224a

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

packages/@headlessui-vue/src/utils/render.test.ts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,21 @@ import { render } from './render'
66
let Dummy = defineComponent({
77
props: {
88
as: { type: [Object, String], default: 'div' },
9+
slot: { type: Object, default: () => ({}) },
910
},
1011
setup(props, { attrs, slots }) {
11-
return () => render({ theirProps: props, ourProps: {}, slots, attrs, slot: {}, name: 'Dummy' })
12+
return () => {
13+
let { slot, ...rest } = props
14+
15+
return render({
16+
theirProps: rest,
17+
ourProps: {},
18+
slots,
19+
attrs,
20+
slot,
21+
name: 'Dummy',
22+
})
23+
}
1224
},
1325
})
1426

@@ -120,3 +132,38 @@ describe('Validation', () => {
120132
expect(document.getElementById('result')).toHaveAttribute('data-test', '123')
121133
})
122134
})
135+
136+
describe('State Data Attributes', () => {
137+
it('as=element', () => {
138+
renderTemplate({
139+
template: html`
140+
<Dummy id="result" as="div" :slot="{active: true, selected: true}">
141+
<div>test</div>
142+
</Dummy>
143+
`,
144+
})
145+
146+
expect(document.getElementById('result')).toHaveAttribute(
147+
'data-headlessui-state',
148+
'active selected'
149+
)
150+
})
151+
152+
it('as=template', () => {
153+
renderTemplate({
154+
template: html`
155+
<Dummy as="template" class="abc" :slot="{active: true, selected: true}">
156+
<div id="result">test</div>
157+
</Dummy>
158+
`,
159+
})
160+
161+
expect(document.getElementById('result')).toHaveClass('abc')
162+
163+
// NOTE: Removing class="abc" causes this assertion to fail
164+
expect(document.getElementById('result')).toHaveAttribute(
165+
'data-headlessui-state',
166+
'active selected'
167+
)
168+
})
169+
})

packages/@headlessui-vue/src/utils/render.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ function _render({
139139
)
140140
}
141141

142-
let mergedProps = mergeProps(firstChild.props ?? {}, incomingProps)
142+
let mergedProps = mergeProps(firstChild.props ?? {}, incomingProps, dataAttributes)
143143
let cloned = cloneVNode(firstChild, mergedProps, true)
144144
// Explicitly override props starting with `on`. This is for event handlers, but there are
145145
// scenario's where we set them to `undefined` explicitly (when `aria-disabled="true"` is
@@ -155,6 +155,7 @@ function _render({
155155
}
156156

157157
if (Array.isArray(children) && children.length === 1) {
158+
// TODO: Do we need to cloneVNode + dataAttributes here?
158159
return children[0]
159160
}
160161

0 commit comments

Comments
 (0)