Skip to content

Commit

Permalink
fix(runtime-core): fix instance accessed via $parent chain when using…
Browse files Browse the repository at this point in the history
… expose() (#4048)
  • Loading branch information
DV8FromTheWorld authored Jul 2, 2021
1 parent 735ada1 commit 12cf9f4
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
11 changes: 10 additions & 1 deletion packages/runtime-core/__tests__/apiExpose.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,13 +171,20 @@ describe('api: expose', () => {
})

test('expose should allow access to built-in instance properties', () => {
const GrandChild = defineComponent({
render() {
return h('div')
}
})

const grandChildRef = ref()
const Child = defineComponent({
render() {
return h('div')
},
setup(_, { expose }) {
expose()
return {}
return () => h(GrandChild, { ref: grandChildRef })
}
})

Expand All @@ -190,5 +197,7 @@ describe('api: expose', () => {
const root = nodeOps.createElement('div')
render(h(Parent), root)
expect(childRef.value.$el.tag).toBe('div')
expect(grandChildRef.value.$parent).toBe(childRef.value)
expect(grandChildRef.value.$parent.$parent).toBe(grandChildRef.value.$root)
})
})
3 changes: 2 additions & 1 deletion packages/runtime-core/src/componentPublicInstance.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
ComponentInternalInstance,
Data,
getExposeProxy,
isStatefulComponent
} from './component'
import { nextTick, queueJob } from './scheduler'
Expand Down Expand Up @@ -217,7 +218,7 @@ const getPublicInstance = (
i: ComponentInternalInstance | null
): ComponentPublicInstance | ComponentInternalInstance['exposed'] | null => {
if (!i) return null
if (isStatefulComponent(i)) return i.exposed ? i.exposed : i.proxy
if (isStatefulComponent(i)) return getExposeProxy(i) || i.proxy
return getPublicInstance(i.parent)
}

Expand Down

0 comments on commit 12cf9f4

Please sign in to comment.