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
|
// should not force local update if set to the same value
|
||||||
expect(compRender).toHaveBeenCalledTimes(3)
|
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) {
|
set(value) {
|
||||||
|
if (!hasChanged(value, localValue)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
const rawProps = i.vnode!.props
|
const rawProps = i.vnode!.props
|
||||||
if (
|
if (
|
||||||
!(
|
!(
|
||||||
|
|
@ -62,8 +65,7 @@ export function useModel(
|
||||||
(`onUpdate:${name}` in rawProps ||
|
(`onUpdate:${name}` in rawProps ||
|
||||||
`onUpdate:${camelizedName}` in rawProps ||
|
`onUpdate:${camelizedName}` in rawProps ||
|
||||||
`onUpdate:${hyphenatedName}` in rawProps)
|
`onUpdate:${hyphenatedName}` in rawProps)
|
||||||
) &&
|
)
|
||||||
hasChanged(value, localValue)
|
|
||||||
) {
|
) {
|
||||||
// no v-model, local update
|
// no v-model, local update
|
||||||
localValue = value
|
localValue = value
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue