diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c2ca79bdb5..2c253a60eb8 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 c7c67bcdbfe..a532294d4c5 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 8bc86be5a7f..41347148bfd 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 a133afaf18b..452e57c6707 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 a2c994f6dd1..8eab5b0c222 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 6fd6e16f8f6..27ce3f49509 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 95ddefb0233..95413ce3437 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/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 097e52f9167..4c30de2f26a 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/package.json b/packages/runtime-core/package.json index adf471ab997..a590e951995 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-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts index 493264ea73a..5bcd316931d 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 @@ -78,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() } diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index ca9fbd84156..51450c5a0fe 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 10ff8b514bb..78a8de2fbdd 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 23255bfadd4..5df49087d2d 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 3086d398627..41d0a893b51 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 d7487c97148..7171f086447 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",