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]
}
}