From f4aa5576cfd5d250d435504e5adc6424af64e6f5 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Fri, 20 Mar 2020 18:59:52 +0800 Subject: [PATCH] feat(v3): Dynamic Slot Names --- .../__tests__/compiler-app-plus-extra.service.spec.js | 8 +++++++- .../__tests__/compiler-app-plus-extra.view.spec.js | 6 ++++++ packages/uni-template-compiler/__tests__/demo.js | 2 +- packages/uni-template-compiler/lib/app/service.js | 5 +++-- packages/uni-template-compiler/lib/app/util.js | 3 +++ packages/uni-template-compiler/lib/app/view.js | 7 ++++--- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js index 42642d27d..fdb4b55fd 100644 --- a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js +++ b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.service.spec.js @@ -146,6 +146,12 @@ describe('codegen', () => { '123d', `with(this){return (_$s(0,'i',a))?_c('text'):(_$s(1,'e',b))?_c('text'):(_$s(2,'e',c))?_c('text'):_c('text')}` ) - }) + }) + it('generate dynamic slot', () => { + assertCodegen( + '', + `with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$s(1,'st',dynamicSlotName),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}` + ) + }) }) /* eslint-enable quotes */ diff --git a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js index 487a15611..088017627 100644 --- a/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js +++ b/packages/uni-template-compiler/__tests__/compiler-app-plus-extra.view.spec.js @@ -87,6 +87,12 @@ describe('codegen', () => { '123d', `with(this){return (_$g(0,'i'))?_c('v-uni-text',{attrs:{"_i":0}},[_v("1")]):(_$g(1,'e'))?_c('v-uni-text',{attrs:{"_i":1}},[_v("2")]):(_$g(2,'e'))?_c('v-uni-text',{attrs:{"_i":2}},[_v("3")]):_c('v-uni-text',{attrs:{"_i":3}},[_v("d")])}` ) + }) + it('generate dynamic slot', () => { + assertCodegen( + '', + `with(this){return _c('base-layout',{attrs:{"_i":0},scopedSlots:_u([{key:_$g(1,'st'),fn:function(_empty_, _svm, _si){return undefined}}],null,true)})}` + ) }) }) /* eslint-enable quotes */ diff --git a/packages/uni-template-compiler/__tests__/demo.js b/packages/uni-template-compiler/__tests__/demo.js index 2ee1fc227..a98c54828 100644 --- a/packages/uni-template-compiler/__tests__/demo.js +++ b/packages/uni-template-compiler/__tests__/demo.js @@ -19,7 +19,7 @@ const scopedPath = path.resolve(__dirname, '../../') const compiler = require('../lib') const res = compiler.compile( ` -{{obj.param1}}123123{{obj.param1}}123123{{obj.param1}} -{{obj.param3}}---{{obj.param3}} {{obj.param2}}aaaa{{obj.param2}}aaaa{{obj.param2}} + `, { miniprogram: true, resourcePath: '/User/fxy/Documents/test.wxml', diff --git a/packages/uni-template-compiler/lib/app/service.js b/packages/uni-template-compiler/lib/app/service.js index 0eb71e660..56fb54125 100644 --- a/packages/uni-template-compiler/lib/app/service.js +++ b/packages/uni-template-compiler/lib/app/service.js @@ -162,9 +162,10 @@ function postTransformNode (el, options) { } else { options.root = el } - traverseNode(el, false, { + traverseNode(el, false, { + createGenVar, forIteratorId: 0, - transformNode, + transformNode, filterModules: options.filterModules }) optimize(el, options) diff --git a/packages/uni-template-compiler/lib/app/util.js b/packages/uni-template-compiler/lib/app/util.js index 72424eb38..e86b4168d 100644 --- a/packages/uni-template-compiler/lib/app/util.js +++ b/packages/uni-template-compiler/lib/app/util.js @@ -207,6 +207,9 @@ function traverseNode (el, parent, state, isScopedSlot) { el.scopedSlots && Object.values(el.scopedSlots).forEach((slot, index) => { state.childIndex = index slot.slotScope = `${slot.slotScope}, _svm, _si` + if (slot.slotTargetDynamic && slot.slotTarget) { + slot.slotTarget = state.createGenVar(slot.attrsMap[ID])('st', slot.slotTarget) + } traverseNode(slot, el, state, true) }) } diff --git a/packages/uni-template-compiler/lib/app/view.js b/packages/uni-template-compiler/lib/app/view.js index 01ff75c84..12119f09d 100644 --- a/packages/uni-template-compiler/lib/app/view.js +++ b/packages/uni-template-compiler/lib/app/view.js @@ -114,7 +114,7 @@ function transformNode (el, parent, state, isScopedSlot) { if (isScopedSlot && String(pid).indexOf('_si') === -1) { pid = getNewId(pid, '_si') } - return parseText(el, parent, { + return parseText(el, parent, { childIndex: state.childIndex || 0, index: 0, view: true, @@ -161,7 +161,8 @@ function postTransformNode (el, options) { } else { options.root = el } - traverseNode(el, false, { + traverseNode(el, false, { + createGenVar, forIteratorId: 0, transformNode, filterModules: options.filterModules @@ -241,4 +242,4 @@ module.exports = { }, postTransformNode, genData -} +} -- GitLab