提交 2f0369be 编写于 作者: fxy060608's avatar fxy060608

wip(mp): add vue-id

上级 6b953f31
......@@ -946,7 +946,7 @@ var serviceContext = (function (vue) {
res.errMsg = normalizeErrMsg$1(res.errMsg, name);
isFunction(beforeAll) && beforeAll(res);
if (res.errMsg === name + ':ok') {
isFunction(beforeSuccess) && beforeSuccess(res);
isFunction(beforeSuccess) && beforeSuccess(res, args);
hasSuccess && success(res);
}
else {
......@@ -1767,6 +1767,25 @@ var serviceContext = (function (vue) {
useI18n().add(LOCALE_ZH_HANT, normalizeMessages(name, keys, ['取消', '從相冊選擇', '拍攝']), false);
}
});
const initI18nSetClipboardDataMsgsOnce = /*#__PURE__*/ once(() => {
const name = 'uni.setClipboardData.';
const keys = ['success'];
{
useI18n().add(LOCALE_EN, normalizeMessages(name, keys, ['Content copied']), false);
}
{
useI18n().add(LOCALE_ES, normalizeMessages(name, keys, ['Contenido copiado']), false);
}
{
useI18n().add(LOCALE_FR, normalizeMessages(name, keys, ['Contenu copié']), false);
}
{
useI18n().add(LOCALE_ZH_HANS, normalizeMessages(name, keys, ['内容已复制']), false);
}
{
useI18n().add(LOCALE_ZH_HANT, normalizeMessages(name, keys, ['內容已復制']), false);
}
});
const initI18nScanCodeMsgsOnce = /*#__PURE__*/ once(() => {
const name = 'uni.scanCode.';
const keys = ['title', 'album', 'fail', 'flash.on', 'flash.off'];
......@@ -4477,7 +4496,37 @@ var serviceContext = (function (vue) {
const API_ADD_PHONE_CONTACT = 'addPhoneContact';
const API_GET_CLIPBOARD_DATA = 'getClipboardData';
const API_SET_CLIPBOARD_DATA = 'setClipboardData';
const API_SET_CLIPBOARD_DATA = 'setClipboardData';
const SetClipboardDataOptions = {
formatArgs: {
showToast: true,
},
beforeInvoke() {
initI18nSetClipboardDataMsgsOnce();
},
beforeSuccess(res, params) {
if (!params.showToast)
return;
const { t } = useI18n();
const title = t('uni.setClipboardData.success');
if (title) {
uni.showToast({
title: title,
icon: 'success',
mask: false,
});
}
},
};
const SetClipboardDataProtocol = {
data: {
type: String,
required: true,
},
showToast: {
type: Boolean,
},
};
const API_ON_ACCELEROMETER = 'onAccelerometer';
const API_OFF_ACCELEROMETER = 'offAccelerometer';
......@@ -6802,7 +6851,7 @@ var serviceContext = (function (vue) {
const clipboard = requireNativePlugin('clipboard');
clipboard.setString(options.data);
resolve();
});
}, SetClipboardDataProtocol, SetClipboardDataOptions);
const API_ON_NETWORK_STATUS_CHANGE = 'onNetworkStatusChange';
function networkListener() {
......
......@@ -1128,7 +1128,7 @@ function createAsyncApiCallback(name, args = {}, { beforeAll, beforeSuccess } =
res.errMsg = normalizeErrMsg$1(res.errMsg, name);
shared.isFunction(beforeAll) && beforeAll(res);
if (res.errMsg === name + ":ok") {
shared.isFunction(beforeSuccess) && beforeSuccess(res);
shared.isFunction(beforeSuccess) && beforeSuccess(res, args);
hasSuccess && success(res);
} else {
hasFail && fail(res);
......
......@@ -2407,7 +2407,7 @@ function createAsyncApiCallback(name, args = {}, { beforeAll, beforeSuccess } =
res.errMsg = normalizeErrMsg$1(res.errMsg, name);
isFunction(beforeAll) && beforeAll(res);
if (res.errMsg === name + ":ok") {
isFunction(beforeSuccess) && beforeSuccess(res);
isFunction(beforeSuccess) && beforeSuccess(res, args);
hasSuccess && success(res);
} else {
hasFail && fail(res);
......
......@@ -8,7 +8,7 @@ describe('compiler: codegen', () => {
`import { vOn as _vOn, vFor as _vFor } from "vue"
export function render(_ctx, _cache) {
return { a: _vFor(_ctx.items, item => { return {}; }), b: _vOn(_ctx.onClick) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }), b: _vOn(_ctx.onClick) }
}`,
{ inline: false, mode: 'module', prefixIdentifiers: false }
)
......@@ -21,7 +21,7 @@ export function render(_ctx, _cache) {
`import { vOn as _vOn, vFor as _vFor } from "vue"
export function render(_ctx, _cache) {
return { a: _vFor(_ctx.items, item => { return {}; }), b: _vOn(_ctx.onClick) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }), b: _vOn(_ctx.onClick) }
}`,
{ inline: false, mode: 'module' }
)
......@@ -37,7 +37,7 @@ return function render(_ctx, _cache) {
with (_ctx) {
const { vOn: _vOn, vFor: _vFor } = _Vue
return { a: _vFor(items, item => { return {}; }), b: _vOn(onClick) }
return { a: _vFor(items, (item, k0, i0) => { return {}; }), b: _vOn(onClick) }
}
}`,
{ inline: false, mode: 'function', prefixIdentifiers: false }
......@@ -50,7 +50,7 @@ return function render(_ctx, _cache) {
`const { vOn: _vOn, vFor: _vFor } = Vue
return function render(_ctx, _cache) {
return { a: _vFor(_ctx.items, item => { return {}; }), b: _vOn(_ctx.onClick) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }), b: _vOn(_ctx.onClick) }
}`,
{ inline: false, mode: 'function' }
)
......
......@@ -2,12 +2,94 @@ import { addComponentBindLink } from '@dcloudio/uni-cli-shared'
import { assert } from './testUtils'
describe('compiler: transform component', () => {
test('basic', () => {
// test('basic', () => {
// assert(
// `<custom/>`,
// `<custom class="vue-ref" vue-id="2a9ec0b0-0" bind:__l="__l"/>`,
// `(_ctx, _cache) => {
// return {}
// }`,
// {
// nodeTransforms: [addComponentBindLink as any],
// }
// )
// })
test('component + component', () => {
assert(
`<custom/>`,
`<custom class="vue-ref" bind:__l="__l"/>`,
`<custom><custom1/></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-0" bind:__l="__l"><custom1 class="vue-ref" vue-id="2a9ec0b0-1,2a9ec0b0-0" bind:__l="__l"/></custom>`,
`(_ctx, _cache) => {
return {}
}`,
{
nodeTransforms: [addComponentBindLink as any],
}
)
})
test('component + component + component', () => {
assert(
`<custom><custom1><custom2/><custom2/></custom1></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-0" bind:__l="__l"><custom1 vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-1,2a9ec0b0-0" bind:__l="__l"><custom2 class="vue-ref" vue-id="2a9ec0b0-2,2a9ec0b0-1" bind:__l="__l"/><custom2 class="vue-ref" vue-id="2a9ec0b0-3,2a9ec0b0-1" bind:__l="__l"/></custom1></custom>`,
`(_ctx, _cache) => {
return {}
}`,
{
nodeTransforms: [addComponentBindLink as any],
}
)
})
test('component with v-for', () => {
assert(
`<custom v-for="item in items"/>`,
`<custom wx:for="{{a}}" wx:for-item="item" class="vue-ref-in-for" vue-id="{{item.a}}" bind:__l="__l"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: '2a9ec0b0-0' + '-' + i0 }; }) }
}`,
{
nodeTransforms: [addComponentBindLink as any],
}
)
assert(
`<custom v-for="(item,key,index) in items"/>`,
`<custom wx:for="{{a}}" wx:for-item="item" class="vue-ref-in-for" vue-id="{{item.a}}" bind:__l="__l"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, key, index) => { return { a: '2a9ec0b0-0' + '-' + index }; }) }
}`,
{
nodeTransforms: [addComponentBindLink as any],
}
)
})
test('component + component with v-for', () => {
assert(
`<custom><custom1 v-for="item in items"/></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-0" bind:__l="__l"><custom1 wx:for="{{a}}" wx:for-item="item" class="vue-ref-in-for" vue-id="{{item.a}}" bind:__l="__l"/></custom>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: '2a9ec0b0-1' + '-' + i0 + ',' + '2a9ec0b0-0' }; }) }
}`,
{
nodeTransforms: [addComponentBindLink as any],
}
)
})
test('component with v-for + component', () => {
assert(
`<custom v-for="item in items"><custom1/></custom>`,
`<custom wx:for="{{a}}" wx:for-item="item" vue-slots="{{['default']}}" class="vue-ref-in-for" vue-id="{{item.b}}" bind:__l="__l"><custom1 class="vue-ref-in-for" vue-id="{{item.a}}" bind:__l="__l"/></custom>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: '2a9ec0b0-1' + '-' + i0 + ',' + ('2a9ec0b0-0' + '-' + i0), b: '2a9ec0b0-0' + '-' + i0 }; }) }
}`,
{
nodeTransforms: [addComponentBindLink as any],
}
)
})
test('component with v-for + component with v-for', () => {
assert(
`<custom v-for="item in items"><custom1 v-for="item1 in item.items"/></custom>`,
`<custom wx:for="{{a}}" wx:for-item="item" vue-slots="{{['default']}}" class="vue-ref-in-for" vue-id="{{item.b}}" bind:__l="__l"><custom1 wx:for="{{item.a}}" wx:for-item="item1" class="vue-ref-in-for" vue-id="{{item1.a}}" bind:__l="__l"/></custom>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: _vFor(item.items, (item1, k1, i1) => { return { a: '2a9ec0b0-1' + '-' + i0 + '-' + i1 + ',' + ('2a9ec0b0-0' + '-' + i0) }; }), b: '2a9ec0b0-0' + '-' + i0 }; }) }
}`,
{
nodeTransforms: [addComponentBindLink as any],
......
......@@ -4,14 +4,14 @@ describe('compiler: transform ref', () => {
test('vue-ref', () => {
assert(
`<custom/>`,
`<custom class="vue-ref"/>`,
`<custom class="vue-ref" vue-id="2a9ec0b0-0"/>`,
`(_ctx, _cache) => {
return {}
}`
)
assert(
`<custom/><custom/>`,
`<custom class="vue-ref"/><custom class="vue-ref"/>`,
`<custom/><custom/><custom1/>`,
`<custom class="vue-ref" vue-id="2a9ec0b0-0"/><custom class="vue-ref" vue-id="2a9ec0b0-1"/><custom1 class="vue-ref" vue-id="2a9ec0b0-2"/>`,
`(_ctx, _cache) => {
return {}
}`
......@@ -20,16 +20,16 @@ describe('compiler: transform ref', () => {
test('vue-ref-in-for', () => {
assert(
`<custom v-for="item in items"/>`,
`<custom wx:for="{{a}}" wx:for-item="item" class="vue-ref-in-for"/>`,
`<custom wx:for="{{a}}" wx:for-item="item" class="vue-ref-in-for" vue-id="{{item.a}}"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: '2a9ec0b0-0' + '-' + i0 }; }) }
}`
)
})
test('static ref', () => {
assert(
`<custom ref="custom"/>`,
`<custom class="vue-ref" data-ref="custom"/>`,
`<custom class="vue-ref" data-ref="custom" vue-id="2a9ec0b0-0"/>`,
`(_ctx, _cache) => {
return {}
}`
......@@ -38,7 +38,7 @@ describe('compiler: transform ref', () => {
test('dynamic ref', () => {
assert(
`<custom :ref="custom"/>`,
`<custom class="vue-ref" data-ref="{{a}}"/>`,
`<custom class="vue-ref" data-ref="{{a}}" vue-id="2a9ec0b0-0"/>`,
`(_ctx, _cache) => {
return { a: _ctx.custom }
}`
......
......@@ -6,7 +6,7 @@ describe('compiler: scope', () => {
`<view v-for="item in items" :key="item.id" :class="{red: item.isRed}" @longpress="longpress" @click="onClick(item)">{{item.title}}</view>`,
`<view wx:for="{{a}}" wx:for-item="item" wx:key="b" class="{{[item.c && 'red']}}" bindlongpress="{{b}}" bindtap="{{item.d}}">{{item.a}}</view>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { a: _toDisplayString(item.title), b: item.id, c: item.isRed, d: _vOn($event => _ctx.onClick(item)) }; }), b: _vOn(_ctx.longpress) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: _toDisplayString(item.title), b: item.id, c: item.isRed, d: _vOn($event => _ctx.onClick(item)) }; }), b: _vOn(_ctx.longpress) }
}`
)
})
......@@ -15,21 +15,21 @@ describe('compiler: scope', () => {
`<view v-for="item in items" :key="item.id">{{item.title}}{{handle(foo)}}<view v-for="item1 in item.list" :key="item1.id" @click="onClick(item)" @longpress="longpress(item1)">{{item.id}}{{item1.title}}</view></view>`,
`<view wx:for="{{a}}" wx:for-item="item" wx:key="e">{{item.a}}{{b}}<view wx:for="{{item.b}}" wx:for-item="item1" wx:key="b" bindtap="{{item.d}}" bindlongpress="{{item1.c}}">{{item.c}}{{item1.a}}</view></view>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { a: _toDisplayString(item.title), b: _vFor(item.list, item1 => { return { a: _toDisplayString(item1.title), b: item1.id, c: _vOn($event => _ctx.longpress(item1)) }; }), c: _toDisplayString(item.id), d: _vOn($event => _ctx.onClick(item)), e: item.id }; }), b: _toDisplayString(_ctx.handle(_ctx.foo)) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: _toDisplayString(item.title), b: _vFor(item.list, (item1, k1, i1) => { return { a: _toDisplayString(item1.title), b: item1.id, c: _vOn($event => _ctx.longpress(item1)) }; }), c: _toDisplayString(item.id), d: _vOn($event => _ctx.onClick(item)), e: item.id }; }), b: _toDisplayString(_ctx.handle(_ctx.foo)) }
}`
)
assert(
`<view v-for="item in items"><view v-for="item1 in item1" :data-id="item.id" :data-title="item1.title"/></view>`,
`<view wx:for="{{a}}" wx:for-item="item"><view wx:for="{{b}}" wx:for-item="item1" data-id="{{item.a}}" data-title="{{item1.a}}"/></view>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { a: item.id }; }), b: _vFor(_ctx.item1, item1 => { return { a: item1.title }; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: item.id }; }), b: _vFor(_ctx.item1, (item1, k1, i1) => { return { a: item1.title }; }) }
}`
)
assert(
`<view v-for="(item,weekIndex) in weeks" :key="weekIndex" :data-id="item.id"><view v-for="(weeks,weeksIndex) in item" :key="weeksIndex" :data-id="weeks.id"/></view>`,
`<view wx:for="{{a}}" wx:for-item="item" wx:key="b" data-id="{{item.c}}"><view wx:for="{{item.a}}" wx:for-item="weeks" wx:key="a" data-id="{{weeks.b}}"/></view>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.weeks, (item, weekIndex) => { return { a: _vFor(item, (weeks, weeksIndex) => { return { a: weeksIndex, b: weeks.id }; }), b: weekIndex, c: item.id }; }) }
return { a: _vFor(_ctx.weeks, (item, weekIndex, i0) => { return { a: _vFor(item, (weeks, weeksIndex, i1) => { return { a: weeksIndex, b: weeks.id }; }), b: weekIndex, c: item.id }; }) }
}`
)
})
......@@ -38,7 +38,7 @@ describe('compiler: scope', () => {
`<view v-for="item in items"><view v-if="true" :data-id="id"></view></view>`,
`<view wx:for="{{a}}" wx:for-item="item"><view wx:if="{{true}}" data-id="{{item.a}}"></view></view>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { ...(true ? { a: _ctx.id } : {}) }; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { ...(true ? { a: _ctx.id } : {}) }; }) }
}`
)
})
......@@ -56,7 +56,7 @@ describe('compiler: scope', () => {
`<view v-if="ok"><view v-for="item in items" :key="item.id" :data-title="item.title" :data-foo="foo" @click="onClick"/></view><view v-else-if="ok1"><view v-for="item in items" :key="item.id" :data-title="item.title" :data-foo="foo" @click="onClick"/></view><view v-else><view v-for="item in items" :key="item.id" :data-title="item.title" :data-foo="foo" @click="onClick"/></view>`,
`<view wx:if="{{a}}"><view wx:for="{{b}}" wx:for-item="item" wx:key="a" data-title="{{item.b}}" data-foo="{{c}}" bindtap="{{d}}"/></view><view wx:elif="{{e}}"><view wx:for="{{f}}" wx:for-item="item" wx:key="a" data-title="{{item.b}}" data-foo="{{g}}" bindtap="{{h}}"/></view><view wx:else><view wx:for="{{i}}" wx:for-item="item" wx:key="a" data-title="{{item.b}}" data-foo="{{j}}" bindtap="{{k}}"/></view>`,
`(_ctx, _cache) => {
return { a: _ctx.ok, ...(_ctx.ok ? { b: _vFor(_ctx.items, item => { return { a: item.id, b: item.title }; }), c: _ctx.foo, d: _vOn(_ctx.onClick) } : _ctx.ok1 ? { f: _vFor(_ctx.items, item => { return { a: item.id, b: item.title }; }), g: _ctx.foo, h: _vOn(_ctx.onClick) } : { i: _vFor(_ctx.items, item => { return { a: item.id, b: item.title }; }), j: _ctx.foo, k: _vOn(_ctx.onClick) }), e: _ctx.ok1 }
return { a: _ctx.ok, ...(_ctx.ok ? { b: _vFor(_ctx.items, (item, k0, i0) => { return { a: item.id, b: item.title }; }), c: _ctx.foo, d: _vOn(_ctx.onClick) } : _ctx.ok1 ? { f: _vFor(_ctx.items, (item, k0, i0) => { return { a: item.id, b: item.title }; }), g: _ctx.foo, h: _vOn(_ctx.onClick) } : { i: _vFor(_ctx.items, (item, k0, i0) => { return { a: item.id, b: item.title }; }), j: _ctx.foo, k: _vOn(_ctx.onClick) }), e: _ctx.ok1 }
}`
)
})
......
......@@ -29,7 +29,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="index in 5" />`,
`<view wx:for="{{a}}" wx:for-item="index"/>`,
`(_ctx, _cache) => {
return { a: _vFor(5, index => { return {}; }) }
return { a: _vFor(5, (index, k0, i0) => { return {}; }) }
}`
)
})
......@@ -38,7 +38,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="(item) in items" />`,
`<view wx:for="{{a}}" wx:for-item="item"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -47,7 +47,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="({ id, value }) in items" />`,
`<view wx:for="{{a}}" wx:for-item="v0"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, ({ id, value }) => { return {}; }) }
return { a: _vFor(_ctx.items, ({ id, value }, k0, i0) => { return {}; }) }
}`
)
})
......@@ -56,7 +56,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="([ id, value ]) in items" />`,
`<view wx:for="{{a}}" wx:for-item="v0"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, ([id, value]) => { return {}; }) }
return { a: _vFor(_ctx.items, ([id, value], k0, i0) => { return {}; }) }
}`
)
})
......@@ -65,7 +65,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="(item, key) in items" />`,
`<view wx:for="{{a}}" wx:for-item="item"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, key) => { return {}; }) }
return { a: _vFor(_ctx.items, (item, key, i0) => { return {}; }) }
}`
)
})
......@@ -83,7 +83,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="(value,,index) in items" />`,
`<view wx:for="{{a}}" wx:for-item="value"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (value, __, index) => { return {}; }) }
return { a: _vFor(_ctx.items, (value, k0, index) => { return {}; }) }
}`
)
})
......@@ -92,7 +92,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="(,,index) in items" />`,
`<view wx:for="{{a}}" wx:for-item="v0"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (_, __, index) => { return {}; }) }
return { a: _vFor(_ctx.items, (v0, k0, index) => { return {}; }) }
}`
)
})
......@@ -101,7 +101,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="item in items" />`,
`<view wx:for="{{a}}" wx:for-item="item"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -110,7 +110,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="item, key in items" />`,
`<view wx:for="{{a}}" wx:for-item="item"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (item, key) => { return {}; }) }
return { a: _vFor(_ctx.items, (item, key, i0) => { return {}; }) }
}`
)
})
......@@ -128,7 +128,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="value, , index in items" />`,
`<view wx:for="{{a}}" wx:for-item="value"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (value, __, index) => { return {}; }) }
return { a: _vFor(_ctx.items, (value, k0, index) => { return {}; }) }
}`
)
})
......@@ -137,7 +137,7 @@ describe(`compiler: v-for`, () => {
`<view v-for=", , index in items" />`,
`<view wx:for="{{a}}" wx:for-item="v0"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, (_, __, index) => { return {}; }) }
return { a: _vFor(_ctx.items, (v0, k0, index) => { return {}; }) }
}`
)
})
......@@ -146,7 +146,7 @@ describe(`compiler: v-for`, () => {
`<template v-for="item in items">hello<view/></template>`,
`<block wx:for="{{a}}" wx:for-item="item">hello<view/></block>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -155,7 +155,7 @@ describe(`compiler: v-for`, () => {
`<template v-for="item in items"><slot/></template>`,
`<block wx:for="{{a}}" wx:for-item="item"><slot/></block>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -165,7 +165,7 @@ describe(`compiler: v-for`, () => {
`<template v-for="item in items" :key="item.id"><view :id="item.id" /></template>`,
`<block wx:for="{{a}}" wx:for-item="item" wx:key="b"><view id="{{item.a}}"/></block>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { a: item.id, b: item.id }; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: item.id, b: item.id }; }) }
}`
)
})
......@@ -174,7 +174,7 @@ describe(`compiler: v-for`, () => {
`<slot v-for="item in items"></slot>`,
`<slot wx:for="{{a}}" wx:for-item="item"></slot>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -183,7 +183,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="(item) in items" :key="item" />`,
`<view wx:for="{{a}}" wx:for-item="item" wx:key="*this"/>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -192,7 +192,7 @@ describe(`compiler: v-for`, () => {
`<template v-for="item in items" :key="item">hello<view/></template>`,
`<block wx:for="{{a}}" wx:for-item="item" wx:key="*this">hello<view/></block>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......@@ -201,7 +201,7 @@ describe(`compiler: v-for`, () => {
`<view v-if="ok" v-for="i in list"/>`,
`<view wx:if="{{a}}" wx:for="{{b}}" wx:for-item="i"/>`,
`(_ctx, _cache) => {
return { a: _ctx.ok, ...(_ctx.ok ? { b: _vFor(_ctx.list, i => { return {}; }) } : {}) }
return { a: _ctx.ok, ...(_ctx.ok ? { b: _vFor(_ctx.list, (i, k0, i0) => { return {}; }) } : {}) }
}`
)
})
......@@ -211,7 +211,7 @@ describe(`compiler: v-for`, () => {
`<template v-if="ok" v-for="i in list"/>`,
`<block wx:if="{{a}}" wx:for="{{b}}" wx:for-item="i"/>`,
`(_ctx, _cache) => {
return { a: _ctx.ok, ...(_ctx.ok ? { b: _vFor(_ctx.list, i => { return {}; }) } : {}) }
return { a: _ctx.ok, ...(_ctx.ok ? { b: _vFor(_ctx.list, (i, k0, i0) => { return {}; }) } : {}) }
}`
)
})
......@@ -615,7 +615,7 @@ describe(`compiler: v-for`, () => {
`<view v-for="item in items" :key="itemKey(item)">test</view>`,
`<view wx:for="{{a}}" wx:for-item="item" wx:key="a">test</view>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { a: _ctx.itemKey(item) }; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: _ctx.itemKey(item) }; }) }
}`
)
})
......@@ -626,7 +626,7 @@ describe(`compiler: v-for`, () => {
`<template v-for="item in items" :key="itemKey(item)">test</template>`,
`<block wx:for="{{a}}" wx:for-item="item" wx:key="a">test</block>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return { a: _ctx.itemKey(item) }; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return { a: _ctx.itemKey(item) }; }) }
}`
)
})
......@@ -636,7 +636,7 @@ describe(`compiler: v-for`, () => {
`<template v-for="item in items" key="key">test</template>`,
`<block wx:for="{{a}}" wx:for-item="item" key="key">test</block>`,
`(_ctx, _cache) => {
return { a: _vFor(_ctx.items, item => { return {}; }) }
return { a: _vFor(_ctx.items, (item, k0, i0) => { return {}; }) }
}`
)
})
......
......@@ -4,7 +4,7 @@ describe('compiler: transform v-model', () => {
test(`component v-model`, () => {
assert(
`<Comp v-model="model" />`,
`<comp class="vue-ref" modelValue="{{a}}" bindupdateModelValue="{{b}}"/>`,
`<comp class="vue-ref" vue-id="2a9ec0b0-0" modelValue="{{a}}" bindupdateModelValue="{{b}}"/>`,
`(_ctx, _cache) => {
return { a: _ctx.model, b: _vOn($event => _ctx.model = $event) }
}`
......@@ -13,7 +13,7 @@ describe('compiler: transform v-model', () => {
test(`component v-model with cache`, () => {
assert(
`<Comp v-model="model" />`,
`<comp class="vue-ref" modelValue="{{a}}" bindupdateModelValue="{{b}}"/>`,
`<comp class="vue-ref" vue-id="2a9ec0b0-0" modelValue="{{a}}" bindupdateModelValue="{{b}}"/>`,
`(_ctx, _cache) => {
return { a: _ctx.model, b: _vOn($event => _ctx.model = $event) }
}`,
......
......@@ -4,14 +4,14 @@ describe('compiler: transform v-slot', () => {
test('default slot', () => {
assert(
`<custom><template v-slot/></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref"><view /></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-0"><view /></custom>`,
`(_ctx, _cache) => {
return {}
}`
)
assert(
`<custom>test</custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref">test</custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-0">test</custom>`,
`(_ctx, _cache) => {
return {}
}`
......@@ -20,7 +20,7 @@ describe('compiler: transform v-slot', () => {
test('named slots', () => {
assert(
`<custom><template v-slot:header/><template v-slot:default/><template v-slot:footer/></custom>`,
`<custom vue-slots="{{['header','default','footer']}}" class="vue-ref"><view slot="header"/><view slot="default"/><view slot="footer"/></custom>`,
`<custom vue-slots="{{['header','default','footer']}}" class="vue-ref" vue-id="2a9ec0b0-0"><view slot="header"/><view slot="default"/><view slot="footer"/></custom>`,
`(_ctx, _cache) => {
return {}
}`
......@@ -30,7 +30,7 @@ describe('compiler: transform v-slot', () => {
test('scoped slots', () => {
assert(
`<custom><template v-slot:default="slotProps"><view>{{ slotProps.item }}</view></template></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref"><view slot="default"><view>{{a}}</view></view></custom>`,
`<custom vue-slots="{{['default']}}" class="vue-ref" vue-id="2a9ec0b0-0"><view slot="default"><view>{{a}}</view></view></custom>`,
`(_ctx, _cache) => {
return { a: _toDisplayString(_ctx.slotProps.item), b: slotProps }
}`
......
......@@ -13,6 +13,7 @@ import { generate as genTemplate } from './template/codegen'
import { transformOn } from './transforms/vOn'
import { transformElement } from './transforms/transformElement'
import { transformBind } from './transforms/vBind'
import { transformComponent } from './transforms/transformComponent'
export type TransformPreset = [
NodeTransform[],
......@@ -31,6 +32,7 @@ export function getBaseTransformPreset({
nodeTransforms.push(transformIdentifier)
}
nodeTransforms.push(transformElement)
nodeTransforms.push(transformComponent)
if (prefixIdentifiers) {
nodeTransforms.push(transformExpression)
}
......
......@@ -90,6 +90,8 @@ export interface TransformContext
}
scope: CodegenRootScope
currentScope: CodegenScope
currentVueId: string
vueIds: string[]
inVOnce: boolean
helper<T extends symbol>(name: T): T
removeHelper<T extends symbol>(name: T): void
......@@ -264,6 +266,7 @@ export function createTransformContext(
)
}
const vueIds: string[] = []
const identifiers = Object.create(null)
const scopes: CodegenScope[] = [rootScope]
const nameMatch = filename.replace(/\?.*$/, '').match(/([^/\\]+)\.\w+$/)
......@@ -304,6 +307,10 @@ export function createTransformContext(
return scopes[scopes.length - 1]
},
currentNode: root,
vueIds,
get currentVueId() {
return vueIds[vueIds.length - 1]
},
inVOnce: false,
// methods
popScope() {
......
import {
ComponentNode,
ElementTypes,
isCoreComponent,
NodeTypes,
} from '@vue/compiler-core'
import { isComponentTag } from '@dcloudio/uni-shared'
import { isVForScope, NodeTransform, TransformContext } from '../transform'
import { createAttributeNode, createBindDirectiveNode } from '../ast'
import { addStaticClass } from './transformElement'
export const transformComponent: NodeTransform = (node, context) => {
const isComponent =
node.type === NodeTypes.ELEMENT &&
node.tagType === ElementTypes.COMPONENT &&
!isComponentTag(node.tag) &&
!isCoreComponent(node.tag) &&
!context.isBuiltInComponent(node.tag)
if (!isComponent) {
return
}
addVueRef(node, context)
addVueId(node, context)
return function postTransformComponent() {
context.vueIds.pop()
}
}
function addVueId(node: ComponentNode, context: TransformContext) {
let { vueId, scopes, currentScope, currentVueId } = context
if (!vueId) {
return
}
vueId = vueId + '-' + scopes.vueId++
const indexs: string[] = []
while (currentScope) {
if (isVForScope(currentScope)) {
indexs.push(`+'-'+${currentScope.indexAlias}`)
}
currentScope = currentScope.parent!
}
const inFor = !!indexs.length
if (inFor) {
vueId = `'${vueId}'` + indexs.reverse().join('')
}
context.vueIds.push(vueId)
let value = vueId
if (currentVueId) {
const isParentDynamic = currentVueId.includes('+')
const isCurrentDynamic = vueId.includes('+')
if (isParentDynamic || isCurrentDynamic) {
value = `(${vueId})+','+(${
isParentDynamic ? currentVueId : `'${currentVueId}'`
})`
} else {
value = vueId + ',' + currentVueId
}
}
if (value.includes('+')) {
return node.props.push(createBindDirectiveNode('vue-id', value))
}
return node.props.push(createAttributeNode('vue-id', value))
}
function addVueRef(node: ComponentNode, context: TransformContext) {
return addStaticClass(
node,
context.scopes.vFor ? 'vue-ref-in-for' : 'vue-ref'
)
}
......@@ -66,7 +66,7 @@ function createClassAttribute(clazz: string): AttributeNode {
return createAttributeNode('class', clazz)
}
function addStaticClass(node: ElementNode, clazz: string) {
export function addStaticClass(node: ElementNode, clazz: string) {
const classProp = node.props.find(
(prop) => prop.type === NodeTypes.ATTRIBUTE && prop.name === 'class'
) as AttributeNode | undefined
......@@ -89,25 +89,10 @@ function addScopeId(node: ElementNode, scopeId: string) {
return addStaticClass(node, scopeId)
}
function addVueId(node: ComponentNode, context: TransformContext) {
let { vueId, scopes } = context
if (!vueId) {
return
}
return vueId + '-' + scopes.vueId++
}
function addVueRef(node: ComponentNode, context: TransformContext) {
return addStaticClass(
node,
context.scopes.vFor ? 'vue-ref-in-for' : 'vue-ref'
)
}
function processComponent(node: ComponentNode, context: TransformContext) {
const { tag } = node
if (context.bindingComponents[tag]) {
return addVueRef(node, context)
return
}
// 1. dynamic component
......@@ -136,9 +121,6 @@ function processComponent(node: ComponentNode, context: TransformContext) {
)
}
addVueId(node, context)
addVueRef(node, context)
// 3. user component (from setup bindings)
const fromSetup = resolveSetupReference(tag, context)
if (fromSetup) {
......
import {
createCompoundExpression,
DirectiveNode,
NodeTypes,
TO_DISPLAY_STRING,
} from '@vue/compiler-core'
......@@ -49,7 +50,9 @@ export const transformIdentifier: NodeTransform = (node, context) => {
}
const exp = dir.exp
if (exp) {
if (isSelfKey(dir, vFor)) {
if (isBuiltIn(dir)) {
// noop
} else if (isSelfKey(dir, vFor)) {
rewriteSelfKey(dir)
} else if (isClassBinding(dir)) {
hasClassBinding = true
......@@ -78,3 +81,13 @@ export const transformIdentifier: NodeTransform = (node, context) => {
}
}
}
// const builtInProps = ['vue-id']
function isBuiltIn(_dir: DirectiveNode) {
return false
// return (
// arg?.type === NodeTypes.SIMPLE_EXPRESSION &&
// builtInProps.includes(arg.content)
// )
}
......@@ -30,16 +30,16 @@ import { rewriteExpression } from './utils'
export type VForOptions = Omit<ForParseResult, 'tagType'> & {
sourceExpr?: Expression
sourceAlias?: string
valueCode?: string
valueExpr?: Identifier | Pattern | RestElement
valueAlias?: string
keyCode?: string
keyExpr?: Identifier | Pattern | RestElement
keyAlias?: string
indexCode?: string
indexExpr?: Identifier | Pattern | RestElement
indexAlias?: string
sourceAlias: string
valueCode: string
valueExpr: Identifier | Pattern | RestElement
valueAlias: string
keyCode: string
keyExpr: Identifier | Pattern | RestElement
keyAlias: string
indexCode: string
indexExpr: Identifier | Pattern | RestElement
indexAlias: string
}
export type ForElementNode = ElementNode & {
......@@ -73,31 +73,26 @@ export const transformFor = createStructuralDirectiveTransform(
const { addIdentifiers, removeIdentifiers } = context
const { source, value, key, index } = parseResult
if (context.prefixIdentifiers) {
value && addIdentifiers(value)
key && addIdentifiers(key)
index && addIdentifiers(index)
addIdentifiers(value)
addIdentifiers(key)
addIdentifiers(index)
}
const { currentScope: parentScope, scopes, popScope } = context
const sourceExpr = parseExpr(source, context)
const valueCode = value && genExpr(value)
const valueExpr = valueCode
? parseParam(valueCode, context, value)
: undefined
const valueAlias =
(valueExpr && parseAlias(valueExpr, valueCode!, 'v' + scopes.vFor)) ||
'v' + scopes.vFor
const keyCode = key && genExpr(key)
const keyExpr = keyCode ? parseParam(keyCode, context, key) : undefined
const keyAlias = keyExpr && parseAlias(keyExpr, keyCode!, 'k' + scopes.vFor)
const indexCode = index && genExpr(index)
const indexExpr = indexCode
? parseParam(indexCode, context, index)
: undefined
const indexAlias =
indexExpr && parseAlias(indexExpr, indexCode!, 'i' + scopes.vFor)
const valueCode = genExpr(value)
const valueExpr = parseParam(valueCode, context, value)
const valueAlias = parseAlias(valueExpr, valueCode, 'v' + scopes.vFor)
const keyCode = genExpr(key)
const keyExpr = parseParam(keyCode, context, key)
const keyAlias = parseAlias(keyExpr, keyCode, 'k' + scopes.vFor)
const indexCode = genExpr(index)
const indexExpr = parseParam(indexCode, context, index)
const indexAlias = parseAlias(indexExpr, indexCode, 'i' + scopes.vFor)
const vForData: VForOptions = {
source,
sourceExpr,
sourceAlias: '',
value,
valueCode,
valueExpr,
......@@ -172,12 +167,12 @@ function clearExpr(expr: Expression) {
function parseAlias(
babelExpr: Identifier | Pattern | RestElement,
exprCode: string,
defaultAlias: string
fallback: string
) {
if (isIdentifier(babelExpr)) {
return exprCode
}
return defaultAlias
return fallback
}
function findVForLocals({ value, key, index }: ForParseResult) {
......@@ -209,9 +204,9 @@ const stripParensRE = /^\(|\)$/g
export interface ForParseResult {
source: ExpressionNode
value: ExpressionNode | undefined
key: ExpressionNode | undefined
index: ExpressionNode | undefined
value: ExpressionNode
key: ExpressionNode
index: ExpressionNode
tagType: ElementTypes
}
......@@ -232,9 +227,9 @@ export function parseForExpression(
RHS.trim(),
exp.indexOf(RHS, LHS.length)
),
value: undefined,
key: undefined,
index: undefined,
value: createSimpleExpression('v' + context.scopes.vFor),
key: createSimpleExpression('k' + context.scopes.vFor),
index: createSimpleExpression('i' + context.scopes.vFor),
tagType: ElementTypes.ELEMENT,
}
if (context.prefixIdentifiers) {
......
......@@ -4960,7 +4960,7 @@ function vFor(source, renderItem) {
if (isArray(source) || isString(source)) {
ret = new Array(source.length);
for (let i = 0, l = source.length; i < l; i++) {
ret[i] = renderItem(source[i], i, undefined);
ret[i] = renderItem(source[i], i, i);
}
}
else if (typeof source === 'number') {
......@@ -4970,12 +4970,12 @@ function vFor(source, renderItem) {
}
ret = new Array(source);
for (let i = 0; i < source; i++) {
ret[i] = renderItem(i + 1, i, undefined);
ret[i] = renderItem(i + 1, i, i);
}
}
else if (isObject(source)) {
if (source[Symbol.iterator]) {
ret = Array.from(source, (item, i) => renderItem(item, i, undefined));
ret = Array.from(source, (item, i) => renderItem(item, i, i));
}
else {
const keys = Object.keys(source);
......@@ -5014,6 +5014,7 @@ function vOn(value) {
}
function createInvoker(initialValue, instance) {
const invoker = (e) => {
patchMPEvent(e);
let args = [e];
if (e.detail && e.detail.__args__) {
args = e.detail.__args__;
......@@ -5023,6 +5024,12 @@ function createInvoker(initialValue, instance) {
invoker.value = initialValue;
return invoker;
}
function patchMPEvent(e) {
if (e.type && e.target) {
e.stopPropagation = () => { };
e.preventDefault = () => { };
}
}
function patchStopImmediatePropagation(e, value) {
if (isArray(value)) {
const originalStop = e.stopImmediatePropagation;
......
......@@ -59,7 +59,7 @@ export function vFor(
if (isArray(source) || isString(source)) {
ret = new Array(source.length)
for (let i = 0, l = source.length; i < l; i++) {
ret[i] = renderItem(source[i], i, undefined)
ret[i] = renderItem(source[i], i, i)
}
} else if (typeof source === 'number') {
if (__DEV__ && !Number.isInteger(source)) {
......@@ -68,12 +68,12 @@ export function vFor(
}
ret = new Array(source)
for (let i = 0; i < source; i++) {
ret[i] = renderItem(i + 1, i, undefined)
ret[i] = renderItem(i + 1, i, i)
}
} else if (isObject(source)) {
if (source[Symbol.iterator as any]) {
ret = Array.from(source as Iterable<any>, (item, i) =>
renderItem(item, i, undefined)
renderItem(item, i, i)
)
} else {
const keys = Object.keys(source)
......
......@@ -49,6 +49,7 @@ function createInvoker(
instance: ComponentInternalInstance | null
) {
const invoker: Invoker = (e: Event) => {
patchMPEvent(e)
let args: unknown[] = [e]
if ((e as MPEvent).detail && (e as MPEvent).detail.__args__) {
args = (e as MPEvent).detail.__args__!
......@@ -64,6 +65,13 @@ function createInvoker(
return invoker
}
function patchMPEvent(e: Event) {
if (e.type && e.target) {
e.stopPropagation = () => {}
e.preventDefault = () => {}
}
}
function patchStopImmediatePropagation(
e: Event,
value: EventValue
......
......@@ -61,7 +61,7 @@ const uniMiniProgramWeixinPlugin = {
config() {
return {
define: {
__VUE_CREATED_DEFERRED__: JSON.stringify('false'),
__VUE_CREATED_DEFERRED__: false,
},
};
},
......
......@@ -11,7 +11,7 @@ const uniMiniProgramWeixinPlugin: Plugin = {
config() {
return {
define: {
__VUE_CREATED_DEFERRED__: JSON.stringify('false'),
__VUE_CREATED_DEFERRED__: false,
},
}
},
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册