diff --git a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js
index b82875fde8ed353a5b6dab6a06360140823e4d5a..11add830b291bbb680a7524abcba5b0f9e932f27 100644
--- a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js
+++ b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js
@@ -251,10 +251,10 @@ describe('mp:compiler-extra', () => {
)
})
- it('generate events inside v-for', () => {
- assertCodegen(
- '',
- ''
+ it('generate events inside v-for', () => {
+ assertCodegen(
+ '',
+ ''
)
// TODO vue的数字 item 是从1,小程序是从0,后续考虑抹平差异
assertCodegen(
@@ -310,23 +310,23 @@ describe('mp:compiler-extra', () => {
assertCodegen(
'',
''
- )
- assertCodegen(
- `
-
-
-
- `,
- ''
- )
- assertCodegen(
- '',
- ''
- )
- assertCodegen(
- '',
- ''
- )
+ )
+ assertCodegen(
+ `
+
+
+
+ `,
+ ''
+ )
+ assertCodegen(
+ '',
+ ''
+ )
+ assertCodegen(
+ '',
+ ''
+ )
})
it('generate class binding', () => {
@@ -586,6 +586,17 @@ describe('mp:compiler-extra', () => {
'{{item.g0}}',
'with(this){var l0=__map(list,function(item,i){var g0=item.split("").join(" ");return{$orig:__get_orig(item),g0:g0}});$mp.data=Object.assign({},{$root:{l0:l0}})}'
)
+ assertCodegen(
+ `
+
+
+ {{formatIt(item2.id)}}
+
+
+ `,
+ '{{\'\'+item2.m0+\'\'}}',
+ 'with(this){var l1=__map(tabList,function(item,index){var l0=__map(list[item.key],function(item2,index2){var m0=formatIt(item2.id);return{$orig:__get_orig(item2),m0:m0}});return{$orig:__get_orig(item),l0:l0}});$mp.data=Object.assign({},{$root:{l1:l1}})}'
+ )
})
it('generate TemplateLiteral ', () => {
@@ -600,11 +611,11 @@ describe('mp:compiler-extra', () => {
''
)
})
- it('generate event ', () => {
- assertCodegen(
- '',
- ''
- )
+ it('generate event ', () => {
+ assertCodegen(
+ '',
+ ''
+ )
assertCodegen(
'{{item.title}}',
@@ -654,15 +665,15 @@ describe('mp:compiler-extra', () => {
'{{ item }}',
'{{item}}'
)
- })
- it('generate bool attr', () => {
- assertCodegen(
- '',
- ''
- )
- assertCodegen(
- '',
- ''
- )
+ })
+ it('generate bool attr', () => {
+ assertCodegen(
+ '',
+ ''
+ )
+ assertCodegen(
+ '',
+ ''
+ )
})
})
diff --git a/packages/uni-template-compiler/lib/script/traverse/render-list.js b/packages/uni-template-compiler/lib/script/traverse/render-list.js
index de40449810ca61f7fffb749572fb1477af9b23f3..e302bd3774101389efb6e29e0afaaa36877d65b1 100644
--- a/packages/uni-template-compiler/lib/script/traverse/render-list.js
+++ b/packages/uni-template-compiler/lib/script/traverse/render-list.js
@@ -146,6 +146,7 @@ module.exports = function traverseRenderList (path, state) {
identifierArray: state.identifierArray,
propertyArray: [],
declarationArray: [],
+ computedProperty: {},
initExpressionStatementArray: state.initExpressionStatementArray
}
@@ -173,6 +174,16 @@ module.exports = function traverseRenderList (path, state) {
functionExpression.traverse(origVisitor, {
forItem
})
+ const keys = Object.keys(forState.computedProperty)
+ if (keys.length) {
+ keys.forEach(key => {
+ const property = forState.computedProperty[key]
+ if (t.isMemberExpression(property) && property.object.name === forItem) {
+ property.object = t.memberExpression(t.identifier(forItem), t.identifier(VAR_ORIGINAL))
+ forState.options.replaceCodes[key] = `'+${genCode(property, true)}+'`
+ }
+ })
+ }
} else {
forPath.traverse(require('./visitor'), forState)
}
diff --git a/packages/uni-template-compiler/lib/util.js b/packages/uni-template-compiler/lib/util.js
index a82eaba52c9037e2e902b4d17f020f3159786ba7..fc3b2a3f4de1694bfea17614dfd867c4af634d18 100644
--- a/packages/uni-template-compiler/lib/util.js
+++ b/packages/uni-template-compiler/lib/util.js
@@ -133,6 +133,9 @@ function processMemberProperty (node, state) {
}
const identifier = '__$m' + (state.options.__m__++) + '__'
state.options.replaceCodes[identifier] = `'+${genCode(property, true)}+'`
+ if (state.computedProperty) {
+ state.computedProperty[identifier] = property
+ }
node.property = t.identifier(identifier)
}
node.computed = false