提交 afe4d8e3 编写于 作者: D DCloud_LXH

fix(mp-baidu): for 循环移除 s-key 使用 trackBy

上级 12c02b93
......@@ -23,8 +23,8 @@ describe('mp:compiler-mp-baidu', () => {
})
it('generate v-for directive', () => {
assertCodegen(
'<view><view v-for="(item,index) in items" :key="index"></view></view>',
'<view><block s-for="{{items}}" s-for-item="item" s-for-index="index" s-key="index"><view></view></block></view>'
'<view><view v-for="(item,index) in items" :key="item.id"></view></view>',
'<view><block s-for="items trackBy item.id" s-for-item="item" s-for-index="index"><view></view></block></view>'
)
})
it('generate scoped slot', () => {
......@@ -125,15 +125,15 @@ describe('mp:compiler-mp-baidu', () => {
)
assertCodegen(
'<view><Test v-for="item in items" :key="item"/></view>',
'<view><block s-for="{{items}}" s-for-item="item" s-for-index="__i0__" s-key="*this"><test vue-id="{{\'551070e6-1-\'+__i0__}}"></test></block></view>'
'<view><block s-for="items trackBy item" s-for-item="item" s-for-index="__i0__"><test vue-id="{{\'551070e6-1-\'+__i0__}}"></test></block></view>'
)
assertCodegen(
'<view><Test v-for="item in items" :key="item"><Test v-for="item in item.items" :key="item"></Test></Test></view>',
'<view><block s-for="{{items}}" s-for-item="item" s-for-index="__i0__" s-key="*this"><test vue-id="{{\'551070e6-1-\'+__i0__}}" vue-slots="{{[\'default\']}}"><block s-for="{{item.items}}" s-for-item="item" s-for-index="__i1__" s-key="*this"><test vue-id="{{(\'551070e6-2-\'+__i0__+\'-\'+__i1__)+\',\'+(\'551070e6-1-\'+__i0__)}}"></test></block></test></block></view>'
'<view><block s-for="items trackBy item" s-for-item="item" s-for-index="__i0__"><test vue-id="{{\'551070e6-1-\'+__i0__}}" vue-slots="{{[\'default\']}}"><block s-for="item.items trackBy item" s-for-item="item" s-for-index="__i1__"><test vue-id="{{(\'551070e6-2-\'+__i0__+\'-\'+__i1__)+\',\'+(\'551070e6-1-\'+__i0__)}}"></test></block></test></block></view>'
)
assertCodegen(
'<view><Test v-for="(item,index) in items" :key="item"><Test v-for="(item,index1) in item.items" :key="item"></Test></Test></view>',
'<view><block s-for="{{items}}" s-for-item="item" s-for-index="index" s-key="*this"><test vue-id="{{\'551070e6-1-\'+index}}" vue-slots="{{[\'default\']}}"><block s-for="{{item.items}}" s-for-item="item" s-for-index="index1" s-key="*this"><test vue-id="{{(\'551070e6-2-\'+index+\'-\'+index1)+\',\'+(\'551070e6-1-\'+index)}}"></test></block></test></block></view>'
'<view><block s-for="items trackBy item" s-for-item="item" s-for-index="index"><test vue-id="{{\'551070e6-1-\'+index}}" vue-slots="{{[\'default\']}}"><block s-for="item.items trackBy item" s-for-item="item" s-for-index="index1"><test vue-id="{{(\'551070e6-2-\'+index+\'-\'+index1)+\',\'+(\'551070e6-1-\'+index)}}"></test></block></test></block></view>'
)
})
......
......@@ -428,8 +428,15 @@ function traverseRenderList (callExprNode, state) {
const prefix = state.options.platform.directive
const isBaidu = state.options.platform.name === 'mp-baidu'
let forValue = genCode(callExprNode.arguments[0], isBaidu)
if(isBaidu && forKey) {
forValue += ` trackBy ${getForKey(forKey, forIndex, state)}`
}
const attr = {
[prefix + 'for']: genCode(callExprNode.arguments[0]),
[prefix + 'for']: forValue,
[prefix + 'for-item']: forItem
}
......@@ -437,7 +444,7 @@ function traverseRenderList (callExprNode, state) {
attr[prefix + 'for-index'] = forIndex
}
if (forKey) {
if (forKey && !isBaidu) {
const key = getForKey(forKey, forIndex, state)
if (key) {
attr[prefix + 'key'] = key
......
......@@ -107,6 +107,7 @@ function getForKey (forKey, forIndex, state) {
if (forKey) {
if (t.isIdentifier(forKey)) {
if (forIndex !== forKey.name) { // 非 forIndex
if (state.options.platform.name === 'mp-baidu') return getCode(forKey)
return '*this'
} else {
// TODO
......@@ -114,6 +115,7 @@ function getForKey (forKey, forIndex, state) {
return forKey.name
}
} else if (t.isMemberExpression(forKey)) {
if (state.options.platform.name === 'mp-baidu') return getCode(forKey)
return forKey.property.name || forKey.property.value
} else {
state.tips.add(uniI18n.__('templateCompiler.noH5KeyNoSupportExpression', { 0: getCode(forKey), 1: 'https://uniapp.dcloud.io/use?id=key' }))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册