From 7834536e686a8ee50b9fb180c1dcd6b66190fd89 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Thu, 30 Apr 2020 10:02:30 +0800 Subject: [PATCH] fix(mp): dynamic event --- packages/uni-migration/__tests__/demo.js | 35 +++++++++++++++---- packages/uni-migration/__tests__/wxml.spec.js | 4 +-- .../transform/traverse.js | 8 +++-- packages/uni-mp-weixin/dist/mp.js | 3 ++ src/core/runtime/mp/polyfill/index.js | 7 ++++ 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/packages/uni-migration/__tests__/demo.js b/packages/uni-migration/__tests__/demo.js index a315ae33..28d9af49 100644 --- a/packages/uni-migration/__tests__/demo.js +++ b/packages/uni-migration/__tests__/demo.js @@ -1,13 +1,36 @@ -const migrate = require('../lib/index') +// const migrate = require('../lib/index') -migrate('/Users/fxy/Downloads/wa-vantui_1.1') +// migrate('/Users/fxy/Downloads/wa-vantui_1.1') // migrate('/Users/fxy/Downloads/wa-vantui_1.1/pages') -// const { -// parse -// } = require('mustache') -// console.log(parse("van-notice-bar__content {{ !scrollable && !wrapable ? 'van-ellipsis' : '' }}")) +const { + parse +} = require('mustache') + +function parseMustache(expr, identifier = false) { + if (!expr) { + return '' + } + const tokens = parse(expr) + const isIdentifier = tokens.length === 1 + return tokens.map(token => { + if (token[0] === 'text') { + if (identifier) { + return token[1] + } + return `'${token[1]}'` + } else if (token[0] === '!') { // {{ !loading }} + return `(!${token[1]})` + } else if (token[0] === 'name') { + if (isIdentifier) { + return token[1] + } + return `(${token[1]})` + } + }).join('+') +} +console.log(parseMustache("click ",true)==='click ') // const { // transformTemplate diff --git a/packages/uni-migration/__tests__/wxml.spec.js b/packages/uni-migration/__tests__/wxml.spec.js index ed0928d2..aad6f619 100644 --- a/packages/uni-migration/__tests__/wxml.spec.js +++ b/packages/uni-migration/__tests__/wxml.spec.js @@ -9,11 +9,11 @@ describe('wxml:compiler', () => { it('generate event', () => { assertCodegen( ``, - `` + `` ) assertCodegen( ``, - `` + `` ) }) it('generate class', () => { diff --git a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js index 5be4b130..fc1a5b0d 100644 --- a/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js +++ b/packages/uni-migration/lib/mp-weixin/transform/template-transformer/transform/traverse.js @@ -127,7 +127,7 @@ function transformFor(attribs) { if (vKey) { if (vKey === '*this') { vKey = vItem - } else if (vKey !== vItem && vKey.indexOf('.')===-1) {// wx:for-key="{{item.value}}" + } else if (vKey !== vItem && vKey.indexOf('.') === -1) { // wx:for-key="{{item.value}}" vKey = vItem + '.' + vKey } attribs[':key'] = vKey @@ -163,7 +163,11 @@ function transformEvent(name, value, attribs, state) { event = transformEventName(name.replace(captureCatchRE, ''), state) + '.stop.prevent.capture' } if (event !== name) { - attribs[event] = parseMustache(value, true) + let newValue = parseMustache(value, true) + if (newValue !== value) { + newValue = `_$self[(${newValue})||'_$noop']($event)` + } + attribs[event] = newValue return true } } diff --git a/packages/uni-mp-weixin/dist/mp.js b/packages/uni-mp-weixin/dist/mp.js index 4bf7df6f..fae6b1f3 100644 --- a/packages/uni-mp-weixin/dist/mp.js +++ b/packages/uni-mp-weixin/dist/mp.js @@ -758,6 +758,9 @@ var polyfill = { beforeCreate () { // 取消 development 时的 Proxy,避免小程序组件模板中使用尚未定义的属性告警 this._renderProxy = this; + + this._$self = this; + this._$noop = noop; }, created () { // properties 中可能会访问 methods,故需要在 created 中初始化 initState(this); diff --git a/src/core/runtime/mp/polyfill/index.js b/src/core/runtime/mp/polyfill/index.js index 5296d715..0bda8b7a 100644 --- a/src/core/runtime/mp/polyfill/index.js +++ b/src/core/runtime/mp/polyfill/index.js @@ -1,3 +1,7 @@ +import { + noop +} from 'uni-shared' + import { initState } from './state/index' @@ -19,6 +23,9 @@ export default { beforeCreate () { // 取消 development 时的 Proxy,避免小程序组件模板中使用尚未定义的属性告警 this._renderProxy = this + + this._$self = this + this._$noop = noop }, created () { // properties 中可能会访问 methods,故需要在 created 中初始化 initState(this) -- GitLab