mirror of https://github.com/vuejs/core.git
fix(reactivity): prevent endless recursion in computed getters (#11797)
This commit is contained in:
parent
c74176ec7b
commit
716275d1b1
|
@ -1,4 +1,6 @@
|
|||
import {
|
||||
type TestElement,
|
||||
defineComponent,
|
||||
h,
|
||||
nextTick,
|
||||
nodeOps,
|
||||
|
@ -6,6 +8,7 @@ import {
|
|||
onUnmounted,
|
||||
render,
|
||||
serializeInner,
|
||||
triggerEvent,
|
||||
} from '@vue/runtime-test'
|
||||
import {
|
||||
type DebuggerEvent,
|
||||
|
@ -958,4 +961,46 @@ describe('reactivity/computed', () => {
|
|||
newValue: 2,
|
||||
})
|
||||
})
|
||||
|
||||
test('should prevent endless recursion in self-referencing computed getters', async () => {
|
||||
const Comp = defineComponent({
|
||||
data() {
|
||||
return {
|
||||
counter: 0,
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
message(): string {
|
||||
if (this.counter === 0) {
|
||||
this.counter++
|
||||
return this.message
|
||||
} else {
|
||||
return `Step ${this.counter}`
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
render() {
|
||||
return [
|
||||
h(
|
||||
'button',
|
||||
{
|
||||
onClick: () => {
|
||||
this.counter++
|
||||
},
|
||||
},
|
||||
'Step',
|
||||
),
|
||||
h('p', this.message),
|
||||
]
|
||||
},
|
||||
})
|
||||
const root = nodeOps.createElement('div')
|
||||
render(h(Comp), root)
|
||||
expect(serializeInner(root)).toBe(`<button>Step</button><p></p>`)
|
||||
triggerEvent(root.children[1] as TestElement, 'click')
|
||||
await nextTick()
|
||||
expect(serializeInner(root)).toBe(`<button>Step</button><p>Step 2</p>`)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -46,7 +46,7 @@ export class Dep {
|
|||
}
|
||||
|
||||
track(debugInfo?: DebuggerEventExtraInfo): Link | undefined {
|
||||
if (!activeSub || !shouldTrack) {
|
||||
if (!activeSub || !shouldTrack || activeSub === this.computed) {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue