From efd75c54fdfd737af1f5c3ba31299b3a49582da5 Mon Sep 17 00:00:00 2001 From: qiang Date: Sat, 15 Aug 2020 18:25:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=AB=AF?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20v-for=20=E9=81=8D=E5=8E=86=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E8=A1=A8=E8=BE=BE=E5=BC=8F=20fixed=20#2012?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__tests__/compiler-extra.spec.js | 19 +++++++++++++++++++ .../lib/script/traverse/data/attrs.js | 10 ++++++---- .../lib/script/traverse/render-list.js | 7 +++++-- packages/uni-template-compiler/lib/util.js | 14 ++++++++++++-- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js index dc0947f3..2e62c598 100644 --- a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js +++ b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js @@ -602,6 +602,25 @@ describe('mp:compiler-extra', () => { '{{\'\'+item2.m0+\'\'}}', 'with(this){var l1=__map(tabList,function(item,index){var $orig=__get_orig(item);var l0=__map(list[item.key],function(item2,index2){var $orig=__get_orig(item2);var m0=formatIt(item2.id);return{$orig:$orig,m0:m0}});return{$orig:$orig,l0:l0}});$mp.data=Object.assign({},{$root:{l1:l1}})}' ) + assertCodegen( + '{{item}}', + '{{item}}' + ) + assertCodegen( + '{{item}}', + '{{item}}', + 'with(this){var l0={"x-x":"x"};$mp.data=Object.assign({},{$root:{l0:l0}})}' + ) + assertCodegen( + '{{item}}', + '{{item}}', + 'with(this){var l0=getList(test);$mp.data=Object.assign({},{$root:{l0:l0}})}' + ) + assertCodegen( + '{{item}}', + '{{item}}', + 'with(this){var m0=get(test);$mp.data=Object.assign({},{$root:{m0:m0}})}' + ) }) it('generate TemplateLiteral ', () => { diff --git a/packages/uni-template-compiler/lib/script/traverse/data/attrs.js b/packages/uni-template-compiler/lib/script/traverse/data/attrs.js index 394b88bf..10c0c18c 100644 --- a/packages/uni-template-compiler/lib/script/traverse/data/attrs.js +++ b/packages/uni-template-compiler/lib/script/traverse/data/attrs.js @@ -1,9 +1,11 @@ -const t = require('@babel/types') - const { IDENTIFIER_ATTR } = require('../../../constants') +const { + isSimpleObjectExpression +} = require('../../../util') + const getMemberExpr = require('../member-expr') module.exports = function processAttrs (paths, path, state, isComponent, tagName) { @@ -11,8 +13,8 @@ module.exports = function processAttrs (paths, path, state, isComponent, tagName if (attrsPath) { attrsPath.get('value.properties').forEach(propertyPath => { const valuePath = propertyPath.get('value') - // 对于普通的ObjectExpression不再单独处理,改为在转换temlplte时用()包裹(微信、QQ) - if (valuePath.isObjectExpression() && valuePath.node.properties.find(({ key, value }) => !t.isIdentifier(key) || !(t.isIdentifier(value) || t.isStringLiteral(value) || t.isBooleanLiteral(value) || t.isNumericLiteral(value) || t.isNullLiteral(value)))) { + // 对于简单的ObjectExpression不再单独处理,改为在转换temlplte时用()包裹(微信、QQ) + if (valuePath.isObjectExpression() && !isSimpleObjectExpression(valuePath.node)) { valuePath.replaceWith(getMemberExpr(path, IDENTIFIER_ATTR, valuePath.node, state)) } }) 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 e302bd37..f96098b5 100644 --- a/packages/uni-template-compiler/lib/script/traverse/render-list.js +++ b/packages/uni-template-compiler/lib/script/traverse/render-list.js @@ -15,7 +15,8 @@ const { genCode, traverseKey, processMemberExpression, - getForIndexIdentifier + getForIndexIdentifier, + isSimpleObjectExpression } = require('../../util') const getMemberExpr = require('./member-expr') @@ -184,6 +185,8 @@ module.exports = function traverseRenderList (path, state) { } }) } + } else if (forPath.isCallExpression() || (forPath.isObjectExpression() && !isSimpleObjectExpression(forPath.node))) { + forPath.replaceWith(getMemberExpr(forPath, IDENTIFIER_FOR, forPath.node, forState)) } else { forPath.traverse(require('./visitor'), forState) } @@ -195,4 +198,4 @@ module.exports = function traverseRenderList (path, state) { forState.declarationArray.forEach(declaration => { state.declarationArray.push(declaration) }) -} +} diff --git a/packages/uni-template-compiler/lib/util.js b/packages/uni-template-compiler/lib/util.js index fc3b2a3f..41b3d3a8 100644 --- a/packages/uni-template-compiler/lib/util.js +++ b/packages/uni-template-compiler/lib/util.js @@ -213,6 +213,15 @@ function makeMap (str, expectsLowerCase) { ? val => map[val.toLowerCase()] : val => map[val] } + +/** + * 微信、QQ小程序模板支持的简单类型 + * @param {*} node + */ +function isSimpleObjectExpression (node) { + return t.isObjectExpression(node) && !node.properties.find(({ key, value }) => !t.isIdentifier(key) || !(t.isIdentifier(value) || t.isStringLiteral(value) || t.isBooleanLiteral(value) || t.isNumericLiteral(value) || t.isNullLiteral(value))) +} + module.exports = { hasOwn, isUnaryTag: makeMap( @@ -242,5 +251,6 @@ module.exports = { return str }), processMemberExpression, - getForIndexIdentifier -} + getForIndexIdentifier, + isSimpleObjectExpression +} -- GitLab