From a18f1ecf05842337f1eb39a6871adb8cb4024093 Mon Sep 17 00:00:00 2001 From: Tycho Date: Wed, 24 Jul 2024 23:25:22 +0800 Subject: [PATCH 1/3] fix(defineModel): correct update with multiple changes in same tick (#11430) close #11429 --- .../__tests__/helpers/useModel.spec.ts | 25 +++++++++++-------- packages/runtime-core/src/helpers/useModel.ts | 7 ++++-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 097e52f91..4c30de2f2 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -614,24 +614,23 @@ describe('useModel', () => { }) test('set no change value', async () => { - let changeChildMsg: (() => void) | null = null + let changeChildMsg!: (val: string) => void - const compRender = vi.fn() + const setValue = vi.fn() const Comp = defineComponent({ props: ['msg'], emits: ['update:msg'], setup(props) { const childMsg = useModel(props, 'msg') - changeChildMsg = () => { - childMsg.value = childMsg.value - } + changeChildMsg = (val: string) => (childMsg.value = val) return () => { return childMsg.value } }, }) - const msg = ref('HI') + const defaultVal = 'defaultVal' + const msg = ref(defaultVal) const Parent = defineComponent({ setup() { return () => @@ -639,7 +638,7 @@ describe('useModel', () => { msg: msg.value, 'onUpdate:msg': val => { msg.value = val - compRender() + setValue() }, }) }, @@ -648,8 +647,14 @@ describe('useModel', () => { const root = nodeOps.createElement('div') render(h(Parent), root) - expect(compRender).toBeCalledTimes(0) - changeChildMsg!() - expect(compRender).toBeCalledTimes(0) + expect(setValue).toBeCalledTimes(0) + + changeChildMsg(defaultVal) + expect(setValue).toBeCalledTimes(0) + + changeChildMsg('changed') + changeChildMsg(defaultVal) + expect(setValue).toBeCalledTimes(2) + expect(msg.value).toBe(defaultVal) }) }) diff --git a/packages/runtime-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts index 493264ea7..c490a699f 100644 --- a/packages/runtime-core/src/helpers/useModel.ts +++ b/packages/runtime-core/src/helpers/useModel.ts @@ -33,7 +33,7 @@ export function useModel( const res = customRef((track, trigger) => { let localValue: any - let prevSetValue: any + let prevSetValue: any = EMPTY_OBJ let prevEmittedValue: any watchSyncEffect(() => { @@ -51,7 +51,10 @@ export function useModel( }, set(value) { - if (!hasChanged(value, localValue)) { + if ( + !hasChanged(value, localValue) && + !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue)) + ) { return } const rawProps = i.vnode!.props From b5cad0e91c41502eaf4c1261e72077e432961216 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 24 Jul 2024 23:26:13 +0800 Subject: [PATCH 2/3] refactor: use hasChanged for useModel comparisons --- packages/runtime-core/src/helpers/useModel.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts index c490a699f..5bcd31693 100644 --- a/packages/runtime-core/src/helpers/useModel.ts +++ b/packages/runtime-core/src/helpers/useModel.ts @@ -81,9 +81,9 @@ export function useModel( // updates and there will be no prop sync. However the local input state // may be out of sync, so we need to force an update here. if ( - value !== emittedValue && - value !== prevSetValue && - emittedValue === prevEmittedValue + hasChanged(value, emittedValue) && + hasChanged(value, prevSetValue) && + !hasChanged(emittedValue, prevEmittedValue) ) { trigger() } From 91112520427ff55941a1c759d7d60a0811ff4a61 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 24 Jul 2024 23:30:30 +0800 Subject: [PATCH 3/3] release: v3.4.34 --- CHANGELOG.md | 9 +++++++++ package.json | 2 +- packages/compiler-core/package.json | 2 +- packages/compiler-dom/package.json | 2 +- packages/compiler-sfc/package.json | 2 +- packages/compiler-ssr/package.json | 2 +- packages/reactivity/package.json | 2 +- packages/runtime-core/package.json | 2 +- packages/runtime-dom/package.json | 2 +- packages/server-renderer/package.json | 2 +- packages/shared/package.json | 2 +- packages/vue-compat/package.json | 2 +- packages/vue/package.json | 2 +- 13 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c2ca79bd..2c253a60e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [3.4.34](https://github.com/vuejs/core/compare/v3.4.33...v3.4.34) (2024-07-24) + + +### Bug Fixes + +* **defineModel:** correct update with multiple changes in same tick ([#11430](https://github.com/vuejs/core/issues/11430)) ([a18f1ec](https://github.com/vuejs/core/commit/a18f1ecf05842337f1eb39a6871adb8cb4024093)), closes [#11429](https://github.com/vuejs/core/issues/11429) + + + ## [3.4.33](https://github.com/vuejs/core/compare/v3.4.32...v3.4.33) (2024-07-19) diff --git a/package.json b/package.json index c7c67bcdb..a532294d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.4.33", + "version": "3.4.34", "packageManager": "pnpm@9.5.0", "type": "module", "scripts": { diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index 8bc86be5a..41347148b 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index a133afaf1..452e57c67 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index a2c994f6d..8eab5b0c2 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index 6fd6e16f8..27ce3f495 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index 95ddefb02..95413ce34 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index adf471ab9..a590e9519 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index ca9fbd841..51450c5a0 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 10ff8b514..78a8de2fb 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.4.33", + "version": "3.4.34", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", diff --git a/packages/shared/package.json b/packages/shared/package.json index 23255bfad..5df49087d 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.4.33", + "version": "3.4.34", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index 3086d3986..41d0a893b 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.4.33", + "version": "3.4.34", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", diff --git a/packages/vue/package.json b/packages/vue/package.json index d7487c971..7171f0864 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.4.33", + "version": "3.4.34", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js",