diff --git a/packages/uni-migration/__tests__/demo.js b/packages/uni-migration/__tests__/demo.js index a315ae33a0abc1c9452811aed5913a9a0e00e3f1..28d9af49069348dd1ffeedcd48d1c70edc1f8e45 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 ed0928d2aa8ec1f83c4d5f912e963502ef209ef2..aad6f6191d5cfa4bf50790494dc90300262e8e55 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 5be4b130e7824366191684ddc1138df3993c47d1..fc1a5b0d46d1d5da5804a9174e9f5a3f4d151fe8 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 4bf7df6fad85196bd73b1abd26b8c9b94d172f39..fae6b1f3f85a54ac2752ed8702d3ea34bd0bcf3a 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 5296d7154441be332b746cb63025cf81296a83b0..0bda8b7a0b1853eec5de3ac68800f835f1aea3a4 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)