diff --git a/packages/runtime-core/__tests__/componentProps.spec.ts b/packages/runtime-core/__tests__/componentProps.spec.ts index 8c9c38b3c1f..20305200834 100644 --- a/packages/runtime-core/__tests__/componentProps.spec.ts +++ b/packages/runtime-core/__tests__/componentProps.spec.ts @@ -874,4 +874,21 @@ describe('component props', () => { await nextTick() expect(props).not.toHaveProperty('onEvent') }) + + // #11880 + test('merged props order', async () => { + const Child = defineComponent({ + props: ['fooBar'], + template: `
{{ fooBar }}
`, + }) + + const Comp = defineComponent({ + components: { Child }, + template: ``, + }) + + const root = document.createElement('div') + domRender(h(Comp), root) + expect(root.innerHTML).toBe('
3
') + }) }) diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 57c0cf8b7d2..28611bce592 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -890,6 +890,8 @@ export function mergeProps(...args: (Data & VNodeProps)[]): Data { : incoming } } else if (key !== '') { + // #11880: order of the later updated keys should also be moved to the end. + if (key in ret) delete ret[key] ret[key] = toMerge[key] } }