提交 fc8b6535 编写于 作者: Q qiang

fix(mp): merge node for native scoped slot

上级 17c95bca
......@@ -97,11 +97,11 @@ describe('mp:compiler-mp-alipay', () => {
it('generate scoped slot', () => {
assertCodegen(
'<component1 :text="\'text\'"><template v-slot="props"><view :class="{text:props.text}">{{props.text}}</view></template></component1>',
'<component1 vue-id="551070e6-1" text="text" onVueInit="__l" vue-slots="{{[\'default\']}}"><block slot-scope="props"><view class="{{((props.text)?\'text\':\'\')}}">{{props.text}}</view></block></component1>'
'<component1 vue-id="551070e6-1" text="text" onVueInit="__l" vue-slots="{{[\'default\']}}"><view class="{{((props.text)?\'text\':\'\')}}" slot-scope="props">{{props.text}}</view></component1>'
)
assertCodegen(
'<component1 :text="\'text\'"><template v-slot="{text}"><view :class="{text:text}">{{text}}</view></template></component1>',
'<component1 vue-id="551070e6-1" text="text" onVueInit="__l" vue-slots="{{[\'default\']}}"><block slot-scope="__SCOPED__"><view class="{{((__SCOPED__.text)?\'text\':\'\')}}">{{__SCOPED__.text}}</view></block></component1>'
'<component1 vue-id="551070e6-1" text="text" onVueInit="__l" vue-slots="{{[\'default\']}}"><view class="{{((__SCOPED__.text)?\'text\':\'\')}}" slot-scope="__SCOPED__">{{__SCOPED__.text}}</view></component1>'
)
})
......@@ -112,7 +112,7 @@ describe('mp:compiler-mp-alipay', () => {
)
assertCodegen(
'<foo><template v-slot:[test]="{user}"><view>{{user}}</view></template></foo>',
'<foo vue-id="551070e6-1" onVueInit="__l" vue-slots="{{[test]}}"><view slot="{{test}}" slot-scope="__SCOPED__"><view>{{__SCOPED__.user}}</view></view></foo>'
'<foo vue-id="551070e6-1" onVueInit="__l" vue-slots="{{[test]}}"><view slot="{{test}}" slot-scope="__SCOPED__">{{__SCOPED__.user}}</view></foo>'
)
})
......
......@@ -40,7 +40,7 @@ describe('mp:compiler-mp-baidu', () => {
)
assertCodegen(
'<foo><view slot-scope="bar">{{ bar.foo }}</view></foo>',
'<foo vue-id="551070e6-1" vue-slots="{{[\'default\']}}"><block><view>{{foo}}</view></block></foo>'
'<foo vue-id="551070e6-1" vue-slots="{{[\'default\']}}"><view>{{foo}}</view></foo>'
)
})
......@@ -51,7 +51,7 @@ describe('mp:compiler-mp-baidu', () => {
)
assertCodegen(
'<foo><view slot="foo" slot-scope="bar">{{ bar.foo }}</view></foo>',
'<foo vue-id="551070e6-1" vue-slots="{{[\'foo\']}}"><block slot="foo"><view>{{foo}}</view></block></foo>'
'<foo vue-id="551070e6-1" vue-slots="{{[\'foo\']}}"><view slot="foo">{{foo}}</view></foo>'
)
})
......@@ -62,7 +62,7 @@ describe('mp:compiler-mp-baidu', () => {
)
assertCodegen(
'<foo><view v-if="\nshow\n" slot="foo" slot-scope="bar">{{ bar.foo }}</view></foo>',
'<foo vue-id="551070e6-1" vue-slots="{{[\'foo\']}}"><block slot="foo"><block s-if="{{show}}"><view>{{foo}}</view></block></block></foo>'
'<foo vue-id="551070e6-1" vue-slots="{{[\'foo\']}}"><view slot="foo" s-if="{{show}}">{{foo}}</view></foo>'
)
})
......@@ -88,7 +88,7 @@ describe('mp:compiler-mp-baidu', () => {
)
assertCodegen(
'<foo><template v-slot:[test]="{user}"><view>{{user}}</view></template></foo>',
'<foo vue-id="551070e6-1" vue-slots="{{[test]}}"><block slot="{{test}}"><view>{{user}}</view></block></foo>'
'<foo vue-id="551070e6-1" vue-slots="{{[test]}}"><view slot="{{test}}">{{user}}</view></foo>'
)
})
......
......@@ -390,9 +390,10 @@ function traverseResolveScopedSlots (callExprNode, state) {
vIfs.push(attr[vIfAttrName])
delete attr[vIfAttrName]
}
node.type = child.type
node.attr = child.attr = nodeAttr = Object.assign(attr, nodeAttr)
node.children = child.children
child.attr = nodeAttr = Object.assign(attr, nodeAttr)
for (const key in child) {
node[key] = child[key]
}
child = node
} else {
resolveVIf()
......@@ -412,9 +413,14 @@ function traverseResolveScopedSlots (callExprNode, state) {
slotNode = node
}
if (slotNode && slotNode !== top) {
// TODO 多层 v-for 嵌套时,此处理导致作用域发生变化,需安全重命名
slotNode.attr.slot = top.attr.slot
delete top.attr.slot
// TODO 多层 v-for 嵌套时,此处理导致作用域发生变化,需安全重命名 slot name
['slot', 'slot-scope'].forEach(key => {
const topAttr = top.attr
if (key in topAttr) {
slotNode.attr[key] = topAttr[key]
delete topAttr[key]
}
})
}
}
resolveVIf()
......@@ -472,25 +478,31 @@ function traverseResolveScopedSlots (callExprNode, state) {
const parentName = parentNode.type
const paramExprNode = fnProperty.value.params[0]
return options.platform.resolveScopedSlots(
const node = options.platform.resolveScopedSlots(
slotName, {
genCode,
generate,
ownerName,
parentName,
parentNode,
resourcePath,
paramExprNode,
returnExprNodes,
traverseExpr: function (exprNode, state) {
const ast = traverseExpr(exprNode, state)
initParent(ast)
return ast
genCode,
generate,
ownerName,
parentName,
parentNode,
resourcePath,
paramExprNode,
returnExprNodes,
traverseExpr: function (exprNode, state) {
const ast = traverseExpr(exprNode, state)
initParent(ast)
return ast
},
normalizeChildren
},
normalizeChildren
},
state
)
// 对原生支持作用域插槽的小程序平台,优化节点
if (['mp-baidu', 'mp-alipay'].includes(platformName)) {
node.attr[ATTR_SLOT_ORIGIN] = slotNameOrigin
return merge(node, ['template', 'block'])
}
return node
}
if (options.scopedSlotsCompiler === 'auto' && slotNode.scopedSlotsCompiler === 'augmented') {
parentNode.attr['scoped-slots-compiler'] = 'augmented'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册