Skip to content

Commit fa6c5d8

Browse files
committed
chore: Merge branch 'main' into minor
2 parents cd28172 + 9111252 commit fa6c5d8

File tree

3 files changed

+29
-15
lines changed

3 files changed

+29
-15
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [3.4.34](https://github.com/vuejs/core/compare/v3.4.33...v3.4.34) (2024-07-24)
2+
3+
* **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)
4+
5+
6+
17
# [3.5.0-alpha.3](https://github.com/vuejs/core/compare/v3.4.33...v3.5.0-alpha.3) (2024-07-19)
28

39

packages/runtime-core/__tests__/helpers/useModel.spec.ts

+15-10
Original file line numberDiff line numberDiff line change
@@ -614,32 +614,31 @@ describe('useModel', () => {
614614
})
615615

616616
test('set no change value', async () => {
617-
let changeChildMsg: (() => void) | null = null
617+
let changeChildMsg!: (val: string) => void
618618

619-
const compRender = vi.fn()
619+
const setValue = vi.fn()
620620
const Comp = defineComponent({
621621
props: ['msg'],
622622
emits: ['update:msg'],
623623
setup(props) {
624624
const childMsg = useModel(props, 'msg')
625-
changeChildMsg = () => {
626-
childMsg.value = childMsg.value
627-
}
625+
changeChildMsg = (val: string) => (childMsg.value = val)
628626
return () => {
629627
return childMsg.value
630628
}
631629
},
632630
})
633631

634-
const msg = ref('HI')
632+
const defaultVal = 'defaultVal'
633+
const msg = ref(defaultVal)
635634
const Parent = defineComponent({
636635
setup() {
637636
return () =>
638637
h(Comp, {
639638
msg: msg.value,
640639
'onUpdate:msg': val => {
641640
msg.value = val
642-
compRender()
641+
setValue()
643642
},
644643
})
645644
},
@@ -648,8 +647,14 @@ describe('useModel', () => {
648647
const root = nodeOps.createElement('div')
649648
render(h(Parent), root)
650649

651-
expect(compRender).toBeCalledTimes(0)
652-
changeChildMsg!()
653-
expect(compRender).toBeCalledTimes(0)
650+
expect(setValue).toBeCalledTimes(0)
651+
652+
changeChildMsg(defaultVal)
653+
expect(setValue).toBeCalledTimes(0)
654+
655+
changeChildMsg('changed')
656+
changeChildMsg(defaultVal)
657+
expect(setValue).toBeCalledTimes(2)
658+
expect(msg.value).toBe(defaultVal)
654659
})
655660
})

packages/runtime-core/src/helpers/useModel.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export function useModel(
3333

3434
const res = customRef((track, trigger) => {
3535
let localValue: any
36-
let prevSetValue: any
36+
let prevSetValue: any = EMPTY_OBJ
3737
let prevEmittedValue: any
3838

3939
watchSyncEffect(() => {
@@ -51,7 +51,10 @@ export function useModel(
5151
},
5252

5353
set(value) {
54-
if (!hasChanged(value, localValue)) {
54+
if (
55+
!hasChanged(value, localValue) &&
56+
!(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))
57+
) {
5558
return
5659
}
5760
const rawProps = i.vnode!.props
@@ -78,9 +81,9 @@ export function useModel(
7881
// updates and there will be no prop sync. However the local input state
7982
// may be out of sync, so we need to force an update here.
8083
if (
81-
value !== emittedValue &&
82-
value !== prevSetValue &&
83-
emittedValue === prevEmittedValue
84+
hasChanged(value, emittedValue) &&
85+
hasChanged(value, prevSetValue) &&
86+
!hasChanged(emittedValue, prevEmittedValue)
8487
) {
8588
trigger()
8689
}

0 commit comments

Comments
 (0)