From 7ec4627902020cccd7b3f4fbc63e1b0d6b9798cd Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 21 Feb 2019 08:52:15 -0500 Subject: [PATCH] fix: ensure generated scoped slot code is compatible with 2.5 fix #9545 --- src/compiler/codegen/index.js | 4 ++-- .../instance/render-helpers/resolve-scoped-slots.js | 11 ++++++----- test/unit/modules/compiler/codegen.spec.js | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/compiler/codegen/index.js b/src/compiler/codegen/index.js index a64c342169..d433f75628 100644 --- a/src/compiler/codegen/index.js +++ b/src/compiler/codegen/index.js @@ -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)}` : `` })` } diff --git a/src/core/instance/render-helpers/resolve-scoped-slots.js b/src/core/instance/render-helpers/resolve-scoped-slots.js index 6439324b74..f11ca0008c 100644 --- a/src/core/instance/render-helpers/resolve-scoped-slots.js +++ b/src/core/instance/render-helpers/resolve-scoped-slots.js @@ -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) { @@ -20,7 +21,7 @@ export function resolveScopedSlots ( } } if (contentHashKey) { - res.$key = contentHashKey + (res: any).$key = contentHashKey } return res } diff --git a/test/unit/modules/compiler/codegen.spec.js b/test/unit/modules/compiler/codegen.spec.js index 98c202dd25..e56b25766f 100644 --- a/test/unit/modules/compiler/codegen.spec.js +++ b/test/unit/modules/compiler/codegen.spec.js @@ -232,25 +232,25 @@ describe('codegen', () => { it('generate dynamic scoped slot', () => { assertCodegen( '', - `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( '', - `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( '
{{ bar }}
', - `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( '', - `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)})}` ) })