fix(runtime-core): instanceWatch should pass this.proxy to source as the first argument (#2753)

This commit is contained in:
edison 2021-02-09 15:00:32 +08:00 committed by GitHub
parent bd1240c127
commit ec8fd10cec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 3 deletions

View File

@ -15,7 +15,8 @@ import {
nodeOps, nodeOps,
serializeInner, serializeInner,
TestElement, TestElement,
h h,
createApp
} from '@vue/runtime-test' } from '@vue/runtime-test'
import { import {
ITERATE_KEY, ITERATE_KEY,
@ -857,4 +858,23 @@ describe('api: watch', () => {
expect(instance!.effects![0].active).toBe(false) expect(instance!.effects![0].active).toBe(false)
}) })
test('this.$watch should pass `this.proxy` to watch source as the first argument ', () => {
let instance: any
const source = jest.fn()
const Comp = defineComponent({
render() {},
created(this: any) {
instance = this
this.$watch(source, function() {})
}
})
const root = nodeOps.createElement('div')
createApp(Comp).mount(root)
expect(instance).toBeDefined()
expect(source).toHaveBeenCalledWith(instance)
})
}) })

View File

@ -181,7 +181,9 @@ function doWatch(
} else if (isReactive(s)) { } else if (isReactive(s)) {
return traverse(s) return traverse(s)
} else if (isFunction(s)) { } else if (isFunction(s)) {
return callWithErrorHandling(s, instance, ErrorCodes.WATCH_GETTER) return callWithErrorHandling(s, instance, ErrorCodes.WATCH_GETTER, [
instance && (instance.proxy as any)
])
} else { } else {
__DEV__ && warnInvalidSource(s) __DEV__ && warnInvalidSource(s)
} }
@ -190,7 +192,9 @@ function doWatch(
if (cb) { if (cb) {
// getter with cb // getter with cb
getter = () => getter = () =>
callWithErrorHandling(source, instance, ErrorCodes.WATCH_GETTER) callWithErrorHandling(source, instance, ErrorCodes.WATCH_GETTER, [
instance && (instance.proxy as any)
])
} else { } else {
// no cb -> simple effect // no cb -> simple effect
getter = () => { getter = () => {