From: yangxiuxiu <79584569+yangxiuxiu1115@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:46:10 +0000 (+0800) Subject: fix(runtime-core): do not emit when defineModel ref is set with same value (#11162) X-Git-Tag: v3.4.32~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1bb0aef084b5cdd4d49aecfed01ec106d9b6897;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): do not emit when defineModel ref is set with same value (#11162) close #11125 --- diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index f5b2a0108b..097e52f916 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -612,4 +612,44 @@ describe('useModel', () => { // should not force local update if set to the same value expect(compRender).toHaveBeenCalledTimes(3) }) + + test('set no change value', async () => { + let changeChildMsg: (() => void) | null = null + + const compRender = vi.fn() + const Comp = defineComponent({ + props: ['msg'], + emits: ['update:msg'], + setup(props) { + const childMsg = useModel(props, 'msg') + changeChildMsg = () => { + childMsg.value = childMsg.value + } + return () => { + return childMsg.value + } + }, + }) + + const msg = ref('HI') + const Parent = defineComponent({ + setup() { + return () => + h(Comp, { + msg: msg.value, + 'onUpdate:msg': val => { + msg.value = val + compRender() + }, + }) + }, + }) + + const root = nodeOps.createElement('div') + render(h(Parent), root) + + expect(compRender).toBeCalledTimes(0) + changeChildMsg!() + expect(compRender).toBeCalledTimes(0) + }) }) diff --git a/packages/runtime-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts index 8e775a4b90..493264ea73 100644 --- a/packages/runtime-core/src/helpers/useModel.ts +++ b/packages/runtime-core/src/helpers/useModel.ts @@ -51,6 +51,9 @@ export function useModel( }, set(value) { + if (!hasChanged(value, localValue)) { + return + } const rawProps = i.vnode!.props if ( !( @@ -62,8 +65,7 @@ export function useModel( (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps) - ) && - hasChanged(value, localValue) + ) ) { // no v-model, local update localValue = value