Skip to content

Commit

Permalink
fix: ensure generated scoped slot code is compatible with 2.5
Browse files Browse the repository at this point in the history
fix #9545
  • Loading branch information
yyx990803 committed Feb 21, 2019
1 parent d9b27a9 commit 7ec4627
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 11 deletions.
4 changes: 2 additions & 2 deletions src/compiler/codegen/index.js
Expand Up @@ -409,9 +409,9 @@ function genScopedSlots (
.join(',')

return `scopedSlots:_u([${generatedSlots}]${
needsForceUpdate ? `,true` : ``
needsForceUpdate ? `,null,true` : ``
}${
!needsForceUpdate && needsKey ? `,false,${hash(generatedSlots)}` : ``
!needsForceUpdate && needsKey ? `,null,false,${hash(generatedSlots)}` : ``
})`
}

Expand Down
11 changes: 6 additions & 5 deletions src/core/instance/render-helpers/resolve-scoped-slots.js
Expand Up @@ -2,15 +2,16 @@

export function resolveScopedSlots (
fns: ScopedSlotsData, // see flow/vnode
hasDynamicKeys: boolean,
contentHashKey: number,
res?: Object
res?: Object,
// the following are added in 2.6
hasDynamicKeys?: boolean,
contentHashKey?: number
): { [key: string]: Function, $stable: boolean } {
res = res || { $stable: !hasDynamicKeys }
for (let i = 0; i < fns.length; i++) {
const slot = fns[i]
if (Array.isArray(slot)) {
resolveScopedSlots(slot, hasDynamicKeys, null, res)
resolveScopedSlots(slot, res, hasDynamicKeys)
} else if (slot) {
// marker for reverse proxying v-slot without scope on this.$slots
if (slot.proxy) {
Expand All @@ -20,7 +21,7 @@ export function resolveScopedSlots (
}
}
if (contentHashKey) {
res.$key = contentHashKey
(res: any).$key = contentHashKey
}
return res
}
8 changes: 4 additions & 4 deletions test/unit/modules/compiler/codegen.spec.js
Expand Up @@ -232,25 +232,25 @@ describe('codegen', () => {
it('generate dynamic scoped slot', () => {
assertCodegen(
'<foo><template :slot="foo" slot-scope="bar">{{ bar }}</template></foo>',
`with(this){return _c('foo',{scopedSlots:_u([{key:foo,fn:function(bar){return [_v(_s(bar))]}}],true)})}`
`with(this){return _c('foo',{scopedSlots:_u([{key:foo,fn:function(bar){return [_v(_s(bar))]}}],null,true)})}`
)
})

it('generate scoped slot with multiline v-if', () => {
assertCodegen(
'<foo><template v-if="\nshow\n" slot-scope="bar">{{ bar }}</template></foo>',
`with(this){return _c('foo',{scopedSlots:_u([{key:"default",fn:function(bar){return (\nshow\n)?[_v(_s(bar))]:undefined}}],true)})}`
`with(this){return _c('foo',{scopedSlots:_u([{key:"default",fn:function(bar){return (\nshow\n)?[_v(_s(bar))]:undefined}}],null,true)})}`
)
assertCodegen(
'<foo><div v-if="\nshow\n" slot="foo" slot-scope="bar">{{ bar }}</div></foo>',
`with(this){return _c(\'foo\',{scopedSlots:_u([{key:"foo",fn:function(bar){return (\nshow\n)?_c(\'div\',{},[_v(_s(bar))]):_e()}}],true)})}`
`with(this){return _c(\'foo\',{scopedSlots:_u([{key:"foo",fn:function(bar){return (\nshow\n)?_c(\'div\',{},[_v(_s(bar))]):_e()}}],null,true)})}`
)
})

it('generate scoped slot with new slot syntax', () => {
assertCodegen(
'<foo><template v-if="show" #default="bar">{{ bar }}</template></foo>',
`with(this){return _c('foo',{scopedSlots:_u([(show)?{key:"default",fn:function(bar){return [_v(_s(bar))]}}:null],true)})}`
`with(this){return _c('foo',{scopedSlots:_u([(show)?{key:"default",fn:function(bar){return [_v(_s(bar))]}}:null],null,true)})}`
)
})

Expand Down

0 comments on commit 7ec4627

Please sign in to comment.