Skip to content

Commit

Permalink
feat(watch): support dot-delimited path in watch option
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Sep 18, 2020
1 parent 5bfcad1 commit 1c9a0b3
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
14 changes: 12 additions & 2 deletions packages/runtime-core/__tests__/apiOptions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ describe('api: options', () => {
const spyB = jest.fn(returnThis)
const spyC = jest.fn(returnThis)
const spyD = jest.fn(returnThis)
const spyE = jest.fn(returnThis)

let ctx: any
const Comp = {
Expand All @@ -123,7 +124,10 @@ describe('api: options', () => {
baz: {
qux: 3
},
qux: 4
qux: 4,
dot: {
path: 5
}
}
},
watch: {
Expand All @@ -137,7 +141,8 @@ describe('api: options', () => {
},
qux: {
handler: 'onQuxChange'
}
},
'dot.path': spyE
},
methods: {
onFooChange: spyA,
Expand Down Expand Up @@ -175,6 +180,11 @@ describe('api: options', () => {
await nextTick()
expect(spyD).toHaveBeenCalledTimes(1)
assertCall(spyD, 0, [5, 4])

ctx.dot.path++
await nextTick()
expect(spyE).toHaveBeenCalledTimes(1)
assertCall(spyE, 0, [6, 5])
})

test('watch array', async () => {
Expand Down
17 changes: 15 additions & 2 deletions packages/runtime-core/src/componentOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -816,7 +816,9 @@ function createWatcher(
publicThis: ComponentPublicInstance,
key: string
) {
const getter = () => (publicThis as any)[key]
const getter = key.includes('.')
? createPathGetter(publicThis, key)
: () => (publicThis as any)[key]
if (isString(raw)) {
const handler = ctx[raw]
if (isFunction(handler)) {
Expand All @@ -840,7 +842,18 @@ function createWatcher(
}
}
} else if (__DEV__) {
warn(`Invalid watch option: "${key}"`)
warn(`Invalid watch option: "${key}"`, raw)
}
}

function createPathGetter(ctx: any, path: string) {
const segments = path.split('.')
return () => {
let cur = ctx
for (let i = 0; i < segments.length && cur; i++) {
cur = cur[segments[i]]
}
return cur
}
}

Expand Down

0 comments on commit 1c9a0b3

Please sign in to comment.