mirror of https://github.com/vuejs/core.git
fix(runtime-core): do not emit when defineModel ref is set with same value (#11162)
close #11125
This commit is contained in:
parent
3e9e32ee0a
commit
f1bb0aef08
|
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue