Skip to content

Commit 9153fc2

Browse files
authored
fix(runtime-core): class and style should be properly normalized in cloneVNode (#1967)
fix #1964
1 parent 2178473 commit 9153fc2

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

packages/runtime-core/__tests__/vnode.spec.ts

+50
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,56 @@ describe('vnode', () => {
265265
setCurrentRenderingInstance(null)
266266
})
267267

268+
test('cloneVNode class normalization', () => {
269+
const vnode = createVNode('div')
270+
const expectedProps = {
271+
class: 'a b'
272+
}
273+
expect(cloneVNode(vnode, { class: 'a b' }).props).toMatchObject(
274+
expectedProps
275+
)
276+
expect(cloneVNode(vnode, { class: ['a', 'b'] }).props).toMatchObject(
277+
expectedProps
278+
)
279+
expect(
280+
cloneVNode(vnode, { class: { a: true, b: true } }).props
281+
).toMatchObject(expectedProps)
282+
expect(
283+
cloneVNode(vnode, { class: [{ a: true, b: true }] }).props
284+
).toMatchObject(expectedProps)
285+
})
286+
287+
test('cloneVNode style normalization', () => {
288+
const vnode = createVNode('div')
289+
const expectedProps = {
290+
style: {
291+
color: 'blue',
292+
width: '300px'
293+
}
294+
}
295+
expect(
296+
cloneVNode(vnode, { style: 'color: blue; width: 300px;' }).props
297+
).toMatchObject(expectedProps)
298+
expect(
299+
cloneVNode(vnode, {
300+
style: {
301+
color: 'blue',
302+
width: '300px'
303+
}
304+
}).props
305+
).toMatchObject(expectedProps)
306+
expect(
307+
cloneVNode(vnode, {
308+
style: [
309+
{
310+
color: 'blue',
311+
width: '300px'
312+
}
313+
]
314+
}).props
315+
).toMatchObject(expectedProps)
316+
})
317+
268318
describe('mergeProps', () => {
269319
test('class', () => {
270320
let props1: Data = { class: 'c' }

packages/runtime-core/src/vnode.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -433,11 +433,7 @@ export function cloneVNode<T, U>(
433433
// This is intentionally NOT using spread or extend to avoid the runtime
434434
// key enumeration cost.
435435
const { props, patchFlag } = vnode
436-
const mergedProps = extraProps
437-
? props
438-
? mergeProps(props, extraProps)
439-
: extend({}, extraProps)
440-
: props
436+
const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props
441437
return {
442438
__v_isVNode: true,
443439
[ReactiveFlags.SKIP]: true,

0 commit comments

Comments
 (0)