refactor: fix implementation of SFC :slotted id handling

fix #2892
This commit is contained in:
Evan You
2021-03-05 11:10:06 -05:00
parent cc975c1292
commit aea88c3280
36 changed files with 723 additions and 457 deletions

View File

@@ -2,13 +2,13 @@ import {
createApp,
h,
createCommentVNode,
withScopeId,
resolveComponent,
ComponentOptions,
ref,
defineComponent,
createTextVNode,
createStaticVNode
createStaticVNode,
withCtx
} from 'vue'
import { escapeHtml } from '@vue/shared'
import { renderToString } from '../src/renderToString'
@@ -634,34 +634,32 @@ function testRender(type: string, render: typeof renderToString) {
describe('scopeId', () => {
// note: here we are only testing scopeId handling for vdom serialization.
// compiled srr render functions will include scopeId directly in strings.
const withId = withScopeId('data-v-test')
const withChildId = withScopeId('data-v-child')
test('basic', async () => {
expect(
await render(
withId(() => {
return h('div')
})()
)
).toBe(`<div data-v-test></div>`)
const Foo = {
__scopeId: 'data-v-test',
render() {
return h('div')
}
}
expect(await render(h(Foo))).toBe(`<div data-v-test></div>`)
})
test('with slots', async () => {
const Child = {
__scopeId: 'data-v-child',
render: withChildId(function(this: any) {
render: function(this: any) {
return h('div', this.$slots.default())
})
}
}
const Parent = {
__scopeId: 'data-v-test',
render: withId(() => {
render: () => {
return h(Child, null, {
default: withId(() => h('span', 'slot'))
default: withCtx(() => h('span', 'slot'))
})
})
}
}
expect(await render(h(Parent))).toBe(