fix(sfc): inherit parent scopeId on child rooot (#756)

This commit is contained in:
hareku
2020-02-21 22:44:13 +09:00
committed by GitHub
parent 1b9b235663
commit 9547c2b93d
5 changed files with 41 additions and 3 deletions

View File

@@ -17,6 +17,27 @@ describe('scopeId runtime support', () => {
expect(serializeInner(root)).toBe(`<div parent><div parent></div></div>`)
})
test('should attach scopeId to components in parent component', () => {
const Child = {
__scopeId: 'child',
render: withChildId(() => {
return h('div')
})
}
const App = {
__scopeId: 'parent',
render: withParentId(() => {
return h('div', [h(Child)])
})
}
const root = nodeOps.createElement('div')
render(h(App), root)
expect(serializeInner(root)).toBe(
`<div parent><div parent child></div></div>`
)
})
test('should work on slots', () => {
const Child = {
__scopeId: 'child',
@@ -41,7 +62,7 @@ describe('scopeId runtime support', () => {
// - scopeId from parent
// - slotted scopeId (with `-s` postfix) from child (the tree owner)
expect(serializeInner(root)).toBe(
`<div child><div parent child-s></div></div>`
`<div parent child><div parent child-s></div></div>`
)
})
})

View File

@@ -39,6 +39,7 @@ export function renderComponentRoot(
): VNode {
const {
type: Component,
parent,
vnode,
proxy,
withProxy,
@@ -102,6 +103,11 @@ export function renderComponentRoot(
if (vnodeHooks !== EMPTY_OBJ) {
result = cloneVNode(result, vnodeHooks)
}
// inherit scopeId
const parentScopeId = parent && parent.type.__scopeId
if (parentScopeId) {
result = cloneVNode(result, { [parentScopeId]: '' })
}
// inherit directives
if (vnode.dirs != null) {
if (__DEV__ && !isElementRoot(result)) {
@@ -127,6 +133,7 @@ export function renderComponentRoot(
result = createVNode(Comment)
}
currentRenderingInstance = null
return result
}