From 9f129aa0ea592caea87e3d8ca5f61b31e5941cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=AF=85?= Date: Fri, 21 Aug 2020 14:11:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Rax=20=E5=87=BA=E7=A0=81?= =?UTF-8?q?=E5=88=B0=E5=B0=8F=E7=A8=8B=E5=BA=8F,=20=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=87=BD=E6=95=B0=E7=BB=91=E5=AE=9A=20JSExpr?= =?UTF-8?q?ession=20=E6=97=B6=E4=B9=9F=E4=B8=8D=E5=BA=94=E8=AF=A5=E5=8C=85?= =?UTF-8?q?=E8=A3=B9=E4=B8=80=E4=B8=AA=20eval,=20=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E4=BC=9A=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/component/rax/jsx.ts | 40 ++++++++----------- .../demo-project/src/pages/Home/index.jsx | 2 +- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/packages/code-generator/src/plugins/component/rax/jsx.ts b/packages/code-generator/src/plugins/component/rax/jsx.ts index 2bf71b84a..497282e39 100644 --- a/packages/code-generator/src/plugins/component/rax/jsx.ts +++ b/packages/code-generator/src/plugins/component/rax/jsx.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; import changeCase from 'change-case'; -import { Expression, MemberExpression } from '@babel/types'; +import { Expression } from '@babel/types'; import { BuilderComponentPlugin, BuilderComponentPluginFactory, @@ -16,6 +16,7 @@ import { NodeSchema, NpmInfo, PIECE_TYPE, + isJSExpression, } from '../../../types'; import { RAX_CHUNK_NAME } from './const'; @@ -202,26 +203,6 @@ function transformJsExpr(expr: string, handlers: CustomHandlerSet) { return `__$$eval(() => (${transformThis2Context(exprAst, handlers)}))`; } -/** this.xxx */ -function isSimpleDirectlyAccessingThis(exprAst: MemberExpression) { - return !exprAst.computed && exprAst.object.type === 'ThisExpression'; -} - -/** this.state.xxx 和 this.utils.xxx 等安全的肯定应该存在的东东 */ -function isSimpleDirectlyAccessingSafeProperties(exprAst: MemberExpression): boolean { - const isPropertySimpleStraight = - !exprAst.computed || (exprAst.property.type !== 'PrivateName' && isSimpleStraightLiteral(exprAst.property)); - - return ( - isPropertySimpleStraight && - exprAst.object.type === 'MemberExpression' && - exprAst.object.object.type === 'ThisExpression' && - !exprAst.object.computed && - exprAst.object.property.type === 'Identifier' && - /^(state|utils|constants|i18n)$/.test(exprAst.object.property.name) - ); -} - /** 判断是非是一些简单直接的字面值 */ function isSimpleStraightLiteral(expr: Expression): boolean { switch (expr.type) { @@ -284,12 +265,25 @@ function generateNodeAttrForRax(this: CustomHandlerSet, attrName: string, attrVa nodeAttr: undefined, }); } + // else: onXxx 的都是事件处理函数需要特殊处理下 + return generateEventHandlerAttrForRax(attrName, attrValue, this); +} + +function generateEventHandlerAttrForRax( + attrName: string, + attrValue: CompositeValue, + handlers: CustomHandlerSet, +): CodePiece[] { // 先出个码 - const valueExpr = generateUnknownType(attrValue, this); + // -- 事件处理函数中 JSExpression 转成 JSFunction 来处理,避免当 JSExpression 处理的时候多包一层 eval 而导致 Rax 转码成小程序的时候出问题 + const valueExpr = generateUnknownType( + isJSExpression(attrValue) ? { type: 'JSFunction', value: attrValue.value } : attrValue, + handlers, + ); // 查询当前作用域下的变量 - const currentScopeVariables = this.scopeBindings?.getAllBindings() || []; + const currentScopeVariables = handlers.scopeBindings?.getAllBindings() || []; if (currentScopeVariables.length <= 0) { return [ { diff --git a/packages/code-generator/test-cases/rax-app/demo2/expected/demo-project/src/pages/Home/index.jsx b/packages/code-generator/test-cases/rax-app/demo2/expected/demo-project/src/pages/Home/index.jsx index 3befd88d4..f1dcacb95 100644 --- a/packages/code-generator/test-cases/rax-app/demo2/expected/demo-project/src/pages/Home/index.jsx +++ b/packages/code-generator/test-cases/rax-app/demo2/expected/demo-project/src/pages/Home/index.jsx @@ -89,7 +89,7 @@ class Home$$Page extends Component { source={{ uri: __$$eval(() => __$$context.state.user.avatar) }} style={{ width: '32px', height: '32px' }} /> - __$$context.hello)}> + {__$$eval(() => __$$context.state.user.name)} {__$$eval(() => __$$context.state.user.age)}岁