From 5bfb56f8db707c06a63792556f2d1374fefebf8e Mon Sep 17 00:00:00 2001 From: LiuSeen <91084928+liuseen-l@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:15:22 +0800 Subject: [PATCH 1/8] fix: useModel change logic --- packages/runtime-core/src/helpers/useModel.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts index 5bcd316931d..376e40cd4a2 100644 --- a/packages/runtime-core/src/helpers/useModel.ts +++ b/packages/runtime-core/src/helpers/useModel.ts @@ -51,8 +51,9 @@ export function useModel( }, set(value) { + const emittedValue = options.set ? options.set(value) : value if ( - !hasChanged(value, localValue) && + !hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue)) ) { return @@ -74,7 +75,7 @@ export function useModel( localValue = value trigger() } - const emittedValue = options.set ? options.set(value) : value + i.emit(`update:${name}`, emittedValue) // #10279: if the local value is converted via a setter but the value // emitted to parent was the same, the parent will not trigger any From 8fd175b5c112cc0fd58ac5523914511f36d74d7a Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 08:16:28 +0000 Subject: [PATCH 2/8] [autofix.ci] apply automated fixes --- packages/runtime-core/src/helpers/useModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/helpers/useModel.ts b/packages/runtime-core/src/helpers/useModel.ts index 376e40cd4a2..8180fb32c47 100644 --- a/packages/runtime-core/src/helpers/useModel.ts +++ b/packages/runtime-core/src/helpers/useModel.ts @@ -75,7 +75,7 @@ export function useModel( localValue = value trigger() } - + i.emit(`update:${name}`, emittedValue) // #10279: if the local value is converted via a setter but the value // emitted to parent was the same, the parent will not trigger any From 045d0dfbf6e7d735a918d1a95ec9111166eabe4d Mon Sep 17 00:00:00 2001 From: LiuSeen <91084928+liuseen-l@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:58:22 +0800 Subject: [PATCH 3/8] feat: useModel test --- .../__tests__/helpers/useModel.spec.ts | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 4c30de2f26a..af13f244108 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -657,4 +657,50 @@ describe('useModel', () => { expect(setValue).toBeCalledTimes(2) expect(msg.value).toBe(defaultVal) }) + + test('custom setter',() => { + let changeChildMsg!: (val: boolean) => void + + const Comp = defineComponent({ + props: ['msg'], + emits: ['update:msg'], + setup(props) { + const childMsg = useModel(props, 'msg',{ + set: (value) => { + if (value === msg.value) { + return null; + } else { + return value; + } + } + }) + changeChildMsg = (val: boolean) => (childMsg.value = val) + return () => { + return childMsg.value + } + }, + }) + + const defaultVal = false + const msg = ref(defaultVal) + const Parent = defineComponent({ + setup() { + return () => + h(Comp, { + msg: msg.value, + 'onUpdate:msg': val => { + msg.value = val + }, + }) + }, + }) + + const root = nodeOps.createElement('div') + render(h(Parent), root) + + changeChildMsg(true) + expect(msg.value).toBe(true) + + changeChildMsg(true) + expect(msg.value).toBe(null) }) From aa80ee73f69c07b2270f2101f9d5bbeaa8c48f5b Mon Sep 17 00:00:00 2001 From: LiuSeen <91084928+liuseen-l@users.noreply.github.com> Date: Wed, 7 Aug 2024 17:02:55 +0800 Subject: [PATCH 4/8] feat: useModel test --- packages/runtime-core/__tests__/helpers/useModel.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index af13f244108..03bdad23066 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -658,7 +658,7 @@ describe('useModel', () => { expect(msg.value).toBe(defaultVal) }) - test('custom setter',() => { + test('custom setter',() => { let changeChildMsg!: (val: boolean) => void const Comp = defineComponent({ @@ -703,4 +703,5 @@ describe('useModel', () => { changeChildMsg(true) expect(msg.value).toBe(null) + }) }) From 89ac057f828e77f61bb62de86116c05be520d5fa Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 09:03:48 +0000 Subject: [PATCH 5/8] [autofix.ci] apply automated fixes --- .../runtime-core/__tests__/helpers/useModel.spec.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 03bdad23066..99c73167c22 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -658,21 +658,21 @@ describe('useModel', () => { expect(msg.value).toBe(defaultVal) }) - test('custom setter',() => { + test('custom setter', () => { let changeChildMsg!: (val: boolean) => void const Comp = defineComponent({ props: ['msg'], emits: ['update:msg'], setup(props) { - const childMsg = useModel(props, 'msg',{ - set: (value) => { + const childMsg = useModel(props, 'msg', { + set: value => { if (value === msg.value) { - return null; + return null } else { - return value; + return value } - } + }, }) changeChildMsg = (val: boolean) => (childMsg.value = val) return () => { From c8a5c797e9ec4d06c2355b3b2b3604e61aaee8e0 Mon Sep 17 00:00:00 2001 From: LiuSeen <91084928+liuseen-l@users.noreply.github.com> Date: Wed, 7 Aug 2024 17:14:44 +0800 Subject: [PATCH 6/8] feat: useModel test --- .../__tests__/helpers/useModel.spec.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 99c73167c22..48122d9eb69 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -658,6 +658,49 @@ describe('useModel', () => { expect(msg.value).toBe(defaultVal) }) + test('custom getter', () => { + let changeChildMsg!: (val: boolean) => void + const getter = (value: boolean) => !value + + const Comp = defineComponent({ + props: ['msg'], + emits: ['update:msg'], + setup(props) { + const childMsg = useModel(props, 'msg', { + get: getter, + set: value => !value, + }) + changeChildMsg = (val: boolean) => (childMsg.value = val) + return () => { + return childMsg.value + } + }, + }) + + const defaultVal = false + const msg = ref(defaultVal) + const Parent = defineComponent({ + setup() { + return () => + h(Comp, { + msg: msg.value, + 'onUpdate:msg': val => { + msg.value = val + }, + }) + }, + }) + + const root = nodeOps.createElement('div') + render(h(Parent), root) + + changeChildMsg(!getter(msg.value)) + expect(msg.value).toBe(true) + + changeChildMsg(!getter(msg.value)) + expect(msg.value).toBe(false) + }) + test('custom setter', () => { let changeChildMsg!: (val: boolean) => void From eba1d03519a917b7c7099bc53a264044b2aee74f Mon Sep 17 00:00:00 2001 From: LiuSeen <91084928+liuseen-l@users.noreply.github.com> Date: Wed, 7 Aug 2024 17:18:09 +0800 Subject: [PATCH 7/8] feat: useModel test --- packages/runtime-core/__tests__/helpers/useModel.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 48122d9eb69..63bdda4ee29 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -658,6 +658,7 @@ describe('useModel', () => { expect(msg.value).toBe(defaultVal) }) + // #11526 test('custom getter', () => { let changeChildMsg!: (val: boolean) => void const getter = (value: boolean) => !value @@ -700,7 +701,7 @@ describe('useModel', () => { changeChildMsg(!getter(msg.value)) expect(msg.value).toBe(false) }) - + // #11541 test('custom setter', () => { let changeChildMsg!: (val: boolean) => void From 1986ffc29b8fdb74fe394e3668912ffa81a4c135 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 7 Aug 2024 21:46:00 +0800 Subject: [PATCH 8/8] Update useModel.spec.ts --- packages/runtime-core/__tests__/helpers/useModel.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime-core/__tests__/helpers/useModel.spec.ts b/packages/runtime-core/__tests__/helpers/useModel.spec.ts index 63bdda4ee29..3c724b0ba00 100644 --- a/packages/runtime-core/__tests__/helpers/useModel.spec.ts +++ b/packages/runtime-core/__tests__/helpers/useModel.spec.ts @@ -701,6 +701,7 @@ describe('useModel', () => { changeChildMsg(!getter(msg.value)) expect(msg.value).toBe(false) }) + // #11541 test('custom setter', () => { let changeChildMsg!: (val: boolean) => void