提交 4e6071cd 编写于 作者: fxy060608's avatar fxy060608

feat(runtime): mp 重构事件实现

上级 4d712784
...@@ -385,13 +385,84 @@ function wrapper$1 (event) { ...@@ -385,13 +385,84 @@ function wrapper$1 (event) {
return event return event
} }
function processEventArgs (event, args = [], isCustom, methodName) { function getExtraValue (vm, dataPathsArray) {
let context = vm;
dataPathsArray.forEach(dataPathArray => {
const dataPath = dataPathArray[0];
const value = dataPathArray[2];
if (dataPath || typeof value !== 'undefined') { // ['','',index,'disable']
const propPath = dataPathArray[1];
const valuePath = dataPathArray[3];
const vFor = dataPath ? vm.__get_value(dataPath, context) : context;
if (Number.isInteger(vFor)) {
context = value;
} else if (!propPath) {
context = vFor[value];
} else {
if (Array.isArray(vFor)) {
context = vFor.find(vForItem => {
return vm.__get_value(propPath, vForItem) === value
});
} else if (isPlainObject(vFor)) {
context = Object.keys(vFor).find(vForKey => {
return vm.__get_value(propPath, vFor[vForKey]) === value
});
} else {
console.error('v-for 暂不支持循环数据:', vFor);
}
}
if (valuePath) {
context = vm.__get_value(valuePath, context);
}
}
});
return context
}
function processEventExtra (vm, extra) {
const extraObj = {};
if (Array.isArray(extra) && extra.length) {
/**
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*'test'
*/
extra.forEach((dataPath, index) => {
if (typeof dataPath === 'string') {
if (!dataPath) { // model,prop.sync
extraObj['$' + index] = vm;
} else {
extraObj['$' + index] = vm.__get_value(dataPath);
}
} else {
extraObj['$' + index] = getExtraValue(vm, dataPath);
}
});
}
return extraObj
}
function processEventArgs (vm, event, args = [], extra = [], isCustom, methodName) {
if (isCustom && !args.length) { // 无参数,直接传入 detail 数组 if (isCustom && !args.length) { // 无参数,直接传入 detail 数组
if (!Array.isArray(event.detail)) { // 应该是使用了 wxcomponent 原生组件,为了向前兼容,传递原始 event 对象 if (!Array.isArray(event.detail)) { // 应该是使用了 wxcomponent 原生组件,为了向前兼容,传递原始 event 对象
return [event] return [event]
} }
return event.detail return event.detail
} }
const extraObj = processEventExtra(vm, extra);
const ret = []; const ret = [];
args.forEach(arg => { args.forEach(arg => {
if (arg === '$event') { if (arg === '$event') {
...@@ -401,7 +472,11 @@ function processEventArgs (event, args = [], isCustom, methodName) { ...@@ -401,7 +472,11 @@ function processEventArgs (event, args = [], isCustom, methodName) {
ret.push(isCustom ? event.detail[0] : event); ret.push(isCustom ? event.detail[0] : event);
} }
} else { } else {
ret.push(arg); if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
ret.push(extraObj[arg]);
} else {
ret.push(arg);
}
} }
}); });
...@@ -444,7 +519,14 @@ function handleEvent (event) { ...@@ -444,7 +519,14 @@ function handleEvent (event) {
} }
handler.once = true; handler.once = true;
} }
handler.apply(this.$vm, processEventArgs(event, eventArray[1], isCustom, methodName)); handler.apply(this.$vm, processEventArgs(
this.$vm,
event,
eventArray[1],
eventArray[2],
isCustom,
methodName
));
}); });
} }
}); });
......
{ {
"name": "@dcloudio/uni-mp-weixin", "name": "@dcloudio/uni-mp-weixin",
"version": "0.0.923", "version": "0.0.924",
"description": "uni-app mp-weixin", "description": "uni-app mp-weixin",
"main": "dist/index.js", "main": "dist/index.js",
"scripts": { "scripts": {
......
...@@ -128,13 +128,84 @@ function wrapper (event) { ...@@ -128,13 +128,84 @@ function wrapper (event) {
return event return event
} }
function processEventArgs (event, args = [], isCustom, methodName) { function getExtraValue (vm, dataPathsArray) {
let context = vm
dataPathsArray.forEach(dataPathArray => {
const dataPath = dataPathArray[0]
const value = dataPathArray[2]
if (dataPath || typeof value !== 'undefined') { // ['','',index,'disable']
const propPath = dataPathArray[1]
const valuePath = dataPathArray[3]
const vFor = dataPath ? vm.__get_value(dataPath, context) : context
if (Number.isInteger(vFor)) {
context = value
} else if (!propPath) {
context = vFor[value]
} else {
if (Array.isArray(vFor)) {
context = vFor.find(vForItem => {
return vm.__get_value(propPath, vForItem) === value
})
} else if (isPlainObject(vFor)) {
context = Object.keys(vFor).find(vForKey => {
return vm.__get_value(propPath, vFor[vForKey]) === value
})
} else {
console.error('v-for 暂不支持循环数据:', vFor)
}
}
if (valuePath) {
context = vm.__get_value(valuePath, context)
}
}
})
return context
}
function processEventExtra (vm, extra) {
const extraObj = {}
if (Array.isArray(extra) && extra.length) {
/**
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*'test'
*/
extra.forEach((dataPath, index) => {
if (typeof dataPath === 'string') {
if (!dataPath) { // model,prop.sync
extraObj['$' + index] = vm
} else {
extraObj['$' + index] = vm.__get_value(dataPath)
}
} else {
extraObj['$' + index] = getExtraValue(vm, dataPath)
}
})
}
return extraObj
}
function processEventArgs (vm, event, args = [], extra = [], isCustom, methodName) {
if (isCustom && !args.length) { // 无参数,直接传入 detail 数组 if (isCustom && !args.length) { // 无参数,直接传入 detail 数组
if (!Array.isArray(event.detail)) { // 应该是使用了 wxcomponent 原生组件,为了向前兼容,传递原始 event 对象 if (!Array.isArray(event.detail)) { // 应该是使用了 wxcomponent 原生组件,为了向前兼容,传递原始 event 对象
return [event] return [event]
} }
return event.detail return event.detail
} }
const extraObj = processEventExtra(vm, extra)
const ret = [] const ret = []
args.forEach(arg => { args.forEach(arg => {
if (arg === '$event') { if (arg === '$event') {
...@@ -144,7 +215,11 @@ function processEventArgs (event, args = [], isCustom, methodName) { ...@@ -144,7 +215,11 @@ function processEventArgs (event, args = [], isCustom, methodName) {
ret.push(isCustom ? event.detail[0] : event) ret.push(isCustom ? event.detail[0] : event)
} }
} else { } else {
ret.push(arg) if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
ret.push(extraObj[arg])
} else {
ret.push(arg)
}
} }
}) })
...@@ -187,7 +262,14 @@ export function handleEvent (event) { ...@@ -187,7 +262,14 @@ export function handleEvent (event) {
} }
handler.once = true handler.once = true
} }
handler.apply(this.$vm, processEventArgs(event, eventArray[1], isCustom, methodName)) handler.apply(this.$vm, processEventArgs(
this.$vm,
event,
eventArray[1],
eventArray[2],
isCustom,
methodName
))
}) })
} }
}) })
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册