提交 784d0e2b 编写于 作者: fxy060608's avatar fxy060608

refactor(v3): diff

上级 eb2f83a1
...@@ -9119,17 +9119,24 @@ var serviceContext = (function () { ...@@ -9119,17 +9119,24 @@ var serviceContext = (function () {
}; };
} }
function wrapperEvent (event) {
event.preventDefault = noop;
event.stopPropagation = noop;
event.mp = event;
return Object.assign({
mp: event // mpvue
}, event)
}
const handleVdData = { const handleVdData = {
[UI_EVENT]: function onUIEvent (vdBatchEvent, vd) { [UI_EVENT]: function onUIEvent (vdBatchEvent, vd) {
vdBatchEvent.forEach(([cid, nid, event]) => { vdBatchEvent.forEach(([cid, nid, event]) => {
nid = String(nid); nid = String(nid);
event.preventDefault = noop;
event.stopPropagation = noop;
const target = vd.elements.find(target => target.cid === cid && target.nid === nid); const target = vd.elements.find(target => target.cid === cid && target.nid === nid);
if (!target) { if (!target) {
return console.error(`event handler[${cid}][${nid}] not found`) return console.error(`event handler[${cid}][${nid}] not found`)
} }
target.dispatchEvent(event.type, event); target.dispatchEvent(event.type, wrapperEvent(event));
}); });
} }
}; };
...@@ -9234,15 +9241,53 @@ var serviceContext = (function () { ...@@ -9234,15 +9241,53 @@ var serviceContext = (function () {
data[k] = v; data[k] = v;
} }
function diffObject (newObj, oldObj) { function diffObject (newObj, oldObj, every = true) {
let result, key, cur, old;
for (key in newObj) {
cur = newObj[key];
old = oldObj[key];
if (old !== cur) {
if (!every) {
return newObj
}
setResult(result || (result = Object.create(null)), key, cur);
}
}
return result
}
function diffArray (newArr, oldArr) {
const newLen = newArr.length;
if (newLen !== oldArr.length) {
return newArr
}
if (isPlainObject(newArr[0])) {
for (let i = 0; i < newLen; i++) {
if (diffObject(newArr[i], oldArr[i], false)) {
return newArr
}
}
} else {
for (let i = 0; i < newLen; i++) {
if (newArr[i] !== oldArr[i]) {
return newArr
}
}
}
}
function diffElmData (newObj, oldObj) {
let result, key, cur, old; let result, key, cur, old;
for (key in newObj) { for (key in newObj) {
cur = newObj[key]; cur = newObj[key];
old = oldObj[key]; old = oldObj[key];
if (old !== cur) { if (old !== cur) {
if (key === 's' && isPlainObject(cur) && isPlainObject(old)) { if (key === B_STYLE && isPlainObject(cur) && isPlainObject(old)) {
const style = diffObject(cur, old); const style = diffObject(cur, old);
style && setResult(result || (result = Object.create(null)), 's', style); style && setResult(result || (result = Object.create(null)), B_STYLE, style);
} else if (key === V_FOR && Array.isArray(cur) && Array.isArray(old)) {
const vFor = diffArray(cur, old);
vFor && setResult(result || (result = Object.create(null)), V_FOR, vFor);
} else { } else {
setResult(result || (result = Object.create(null)), key, cur); setResult(result || (result = Object.create(null)), key, cur);
} }
...@@ -9260,7 +9305,7 @@ var serviceContext = (function () { ...@@ -9260,7 +9305,7 @@ var serviceContext = (function () {
setResult(result, id, cur); setResult(result, id, cur);
continue continue
} }
const idObj = diffObject(cur, old); const idObj = diffElmData(cur, old);
idObj && setResult(result, id, idObj); idObj && setResult(result, id, idObj);
} }
return result return result
......
...@@ -581,7 +581,7 @@ var request_component_observer = __webpack_require__(49); ...@@ -581,7 +581,7 @@ var request_component_observer = __webpack_require__(49);
destroyComponentObserver: request_component_observer["a" /* destroyComponentObserver */] destroyComponentObserver: request_component_observer["a" /* destroyComponentObserver */]
}); });
// EXTERNAL MODULE: ./src/core/view/bridge/subscribe/scroll.js // EXTERNAL MODULE: ./src/core/view/bridge/subscribe/scroll.js
var subscribe_scroll = __webpack_require__(13); var subscribe_scroll = __webpack_require__(12);
// EXTERNAL MODULE: ./src/platforms/app-plus/view/bridge/subscribe/index.js // EXTERNAL MODULE: ./src/platforms/app-plus/view/bridge/subscribe/index.js
var bridge_subscribe = __webpack_require__(56); var bridge_subscribe = __webpack_require__(56);
...@@ -598,7 +598,7 @@ function initSubscribe(subscribe) { ...@@ -598,7 +598,7 @@ function initSubscribe(subscribe) {
Object(bridge_subscribe["a" /* default */])(subscribe); Object(bridge_subscribe["a" /* default */])(subscribe);
} }
// EXTERNAL MODULE: ./src/platforms/app-plus/view/bridge.js // EXTERNAL MODULE: ./src/platforms/app-plus/view/bridge.js
var bridge = __webpack_require__(12); var bridge = __webpack_require__(11);
// CONCATENATED MODULE: ./src/core/view/bridge/index.js // CONCATENATED MODULE: ./src/core/view/bridge/index.js
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "on", function() { return on; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "on", function() { return on; });
...@@ -9448,118 +9448,6 @@ function getWindowOffset() { ...@@ -9448,118 +9448,6 @@ function getWindowOffset() {
/* 10 */ /* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return vd; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initData; });
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41);
/* harmony import */ var _vdom_sync__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(59);
/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(43);
/* harmony import */ var _page_factory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(42);
var _handleData;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var vd;
var PageVueComponent;
var handleData = (_handleData = {}, _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* PAGE_CREATE */ "c"], function onPageCreate(data) {
var _data = _slicedToArray(data, 3),
pageId = _data[0],
pagePath = _data[1],
pageOptions = _data[2];
document.title = "".concat(pagePath, "[").concat(pageId, "]"); // 设置当前页面伪对象,方便其他地方使用 getCurrentPages 获取当前页面 id,route
Object(_page__WEBPACK_IMPORTED_MODULE_4__[/* setCurrentPage */ "b"])(pageId, pagePath); // 初始化当前页面 VueComponent(生成页面样式代码)
PageVueComponent = Object(_page_factory__WEBPACK_IMPORTED_MODULE_5__[/* getPageVueComponent */ "b"])(pagePath); // 生成当前页面 vd
vd = new _vdom_sync__WEBPACK_IMPORTED_MODULE_3__[/* VDomSync */ "a"](pageId); // 通知页面创建,根据当前页面配置信息,初始化部分事件
UniViewJSBridge.subscribeHandler(_constants__WEBPACK_IMPORTED_MODULE_2__[/* ON_PAGE_CREATE */ "a"], pageOptions, pageId);
}), _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* MOUNTED_DATA */ "b"], function onMounted(data) {
vd.addVData.apply(vd, data);
}), _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* UPDATED_DATA */ "f"], function onUpdated(data) {
vd.updateVData.apply(vd, data);
}), _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* PAGE_CREATED */ "d"], function onPageCreated(data) {
var _data2 = _slicedToArray(data, 2),
pageId = _data2[0],
pagePath = _data2[1];
new PageVueComponent({
mpType: 'page',
pageId: pageId,
pagePath: pagePath
}).$mount('#app');
}), _handleData);
function vdSync(_ref) {
var data = _ref.data,
options = _ref.options;
var isVdCallback = true;
data.forEach(function (data) {
if (data[0] === _constants__WEBPACK_IMPORTED_MODULE_1__[/* PAGE_CREATE */ "c"]) {
// 页面创建无需触发 callback
isVdCallback = false;
}
handleData[data[0]](data[1]);
});
vd.flush();
isVdCallback && vue__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].nextTick(function () {
UniViewJSBridge.publishHandler(_constants__WEBPACK_IMPORTED_MODULE_1__[/* VD_SYNC_CALLBACK */ "h"]);
});
}
function getData(id, name) {
try {
return this.$r[id][name];
} catch (e) {
console.error(this.$options.__file + ":[".concat(this._$id, "]$r[").concat(id, "][").concat(name, "] is undefined"));
}
}
function initData(Vue) {
Vue.prototype._$g = getData;
UniViewJSBridge.subscribe(_constants__WEBPACK_IMPORTED_MODULE_1__[/* VD_SYNC */ "g"], vdSync);
Object.defineProperty(Vue.prototype, '_$vd', {
get: function get() {
return !this.$options.isReserved && vd;
}
});
Vue.mixin({
beforeCreate: function beforeCreate() {
if (this.$options.mpType) {
this.mpType = this.$options.mpType;
}
if (this._$vd) {
this._$vd.initVm(this);
}
}
});
}
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(4)))
/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
// EXTERNAL MODULE: ./src/shared/index.js + 4 modules // EXTERNAL MODULE: ./src/shared/index.js + 4 modules
...@@ -9811,7 +9699,7 @@ function initEvents() { ...@@ -9811,7 +9699,7 @@ function initEvents() {
} }
/***/ }), /***/ }),
/* 12 */ /* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
...@@ -9852,14 +9740,14 @@ function publishHandler(event) { ...@@ -9852,14 +9740,14 @@ function publishHandler(event) {
} }
/***/ }), /***/ }),
/* 13 */ /* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
/* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return disableScroll; }); /* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return disableScroll; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return pageScrollTo; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return pageScrollTo; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return createScrollListener; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return createScrollListener; });
/* harmony import */ var uni_platform_view_bridge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var uni_platform_view_bridge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11);
function disableScroll(evt) { function disableScroll(evt) {
evt.preventDefault(); evt.preventDefault();
...@@ -9982,6 +9870,118 @@ function createScrollListener(pageId, _ref2) { ...@@ -9982,6 +9870,118 @@ function createScrollListener(pageId, _ref2) {
} }
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(4))) /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(4)))
/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return vd; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initData; });
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41);
/* harmony import */ var _vdom_sync__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(59);
/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(43);
/* harmony import */ var _page_factory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(42);
var _handleData;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var vd;
var PageVueComponent;
var handleData = (_handleData = {}, _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* PAGE_CREATE */ "c"], function onPageCreate(data) {
var _data = _slicedToArray(data, 3),
pageId = _data[0],
pagePath = _data[1],
pageOptions = _data[2];
document.title = "".concat(pagePath, "[").concat(pageId, "]"); // 设置当前页面伪对象,方便其他地方使用 getCurrentPages 获取当前页面 id,route
Object(_page__WEBPACK_IMPORTED_MODULE_4__[/* setCurrentPage */ "b"])(pageId, pagePath); // 初始化当前页面 VueComponent(生成页面样式代码)
PageVueComponent = Object(_page_factory__WEBPACK_IMPORTED_MODULE_5__[/* getPageVueComponent */ "b"])(pagePath); // 生成当前页面 vd
vd = new _vdom_sync__WEBPACK_IMPORTED_MODULE_3__[/* VDomSync */ "a"](pageId); // 通知页面创建,根据当前页面配置信息,初始化部分事件
UniViewJSBridge.subscribeHandler(_constants__WEBPACK_IMPORTED_MODULE_2__[/* ON_PAGE_CREATE */ "a"], pageOptions, pageId);
}), _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* MOUNTED_DATA */ "b"], function onMounted(data) {
vd.addVData.apply(vd, data);
}), _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* UPDATED_DATA */ "f"], function onUpdated(data) {
vd.updateVData.apply(vd, data);
}), _defineProperty(_handleData, _constants__WEBPACK_IMPORTED_MODULE_1__[/* PAGE_CREATED */ "d"], function onPageCreated(data) {
var _data2 = _slicedToArray(data, 2),
pageId = _data2[0],
pagePath = _data2[1];
new PageVueComponent({
mpType: 'page',
pageId: pageId,
pagePath: pagePath
}).$mount('#app');
}), _handleData);
function vdSync(_ref) {
var data = _ref.data,
options = _ref.options;
var isVdCallback = true;
data.forEach(function (data) {
if (data[0] === _constants__WEBPACK_IMPORTED_MODULE_1__[/* PAGE_CREATE */ "c"]) {
// 页面创建无需触发 callback
isVdCallback = false;
}
handleData[data[0]](data[1]);
});
vd.flush();
isVdCallback && vue__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].nextTick(function () {
UniViewJSBridge.publishHandler(_constants__WEBPACK_IMPORTED_MODULE_1__[/* VD_SYNC_CALLBACK */ "h"]);
});
}
function getData(id, name) {
try {
return this.$r[id][name];
} catch (e) {
console.error(this.$options.__file + ":[".concat(this._$id, "]$r[").concat(id, "][").concat(name, "] is undefined"));
}
}
function initData(Vue) {
Vue.prototype._$g = getData;
UniViewJSBridge.subscribe(_constants__WEBPACK_IMPORTED_MODULE_1__[/* VD_SYNC */ "g"], vdSync);
Object.defineProperty(Vue.prototype, '_$vd', {
get: function get() {
return !this.$options.isReserved && vd;
}
});
Vue.mixin({
beforeCreate: function beforeCreate() {
if (this.$options.mpType) {
this.mpType = this.$options.mpType;
}
if (this._$vd) {
this._$vd.initVm(this);
}
}
});
}
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(4)))
/***/ }), /***/ }),
/* 14 */ /* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
...@@ -12625,7 +12625,7 @@ function requestComponentInfo(_ref, pageId) { ...@@ -12625,7 +12625,7 @@ function requestComponentInfo(_ref, pageId) {
"use strict"; "use strict";
/* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initSubscribe; }); /* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initSubscribe; });
/* harmony import */ var uni_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); /* harmony import */ var uni_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var uni_core_view_bridge_subscribe_scroll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(13); /* harmony import */ var uni_core_view_bridge_subscribe_scroll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12);
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41);
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3);
...@@ -12673,7 +12673,7 @@ function initSubscribe(subscribe) { ...@@ -12673,7 +12673,7 @@ function initSubscribe(subscribe) {
"use strict"; "use strict";
/* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony import */ var uni_helpers_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); /* WEBPACK VAR INJECTION */(function(UniViewJSBridge) {/* harmony import */ var uni_helpers_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7);
/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
/* harmony import */ var _behaviors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(61); /* harmony import */ var _behaviors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(61);
/* harmony import */ var _wxs_component_descriptor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(58); /* harmony import */ var _wxs_component_descriptor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(58);
...@@ -13127,7 +13127,7 @@ function initVue(Vue) { ...@@ -13127,7 +13127,7 @@ function initVue(Vue) {
var plugins = __webpack_require__(57); var plugins = __webpack_require__(57);
// EXTERNAL MODULE: ./src/platforms/app-plus/view/framework/plugins/data.js // EXTERNAL MODULE: ./src/platforms/app-plus/view/framework/plugins/data.js
var data = __webpack_require__(10); var data = __webpack_require__(13);
// CONCATENATED MODULE: ./src/platforms/app-plus/view/framework/plugins/event.js // CONCATENATED MODULE: ./src/platforms/app-plus/view/framework/plugins/event.js
...@@ -13149,12 +13149,11 @@ function initEvent(Vue) { ...@@ -13149,12 +13149,11 @@ function initEvent(Vue) {
}; };
Vue.prototype.$handleViewEvent = function ($vueEvent, options) { Vue.prototype.$handleViewEvent = function ($vueEvent, options) {
var isCustomEvent = $vueEvent._processed; // 自定义事件已提前处理过 // const isCustomEvent = $vueEvent._processed // 自定义事件已提前处理过
var $event = this.$handleEvent($vueEvent); var $event = this.$handleEvent($vueEvent);
var cid = this._$id; // 当自定义组件根节点触发事件时,nid 始终为 0 var cid = this._$id; // 当自定义组件根节点触发事件时,nid 始终为 0
var nid = isCustomEvent || $vueEvent.currentTarget === this.$el ? 0 : $event.options.nid; var nid = $vueEvent.currentTarget === this.$el ? 0 : $event.options.nid;
if (typeof nid === 'undefined') { if (typeof nid === 'undefined') {
return console.error("[".concat(cid, "] nid not found")); return console.error("[".concat(cid, "] nid not found"));
...@@ -17955,7 +17954,7 @@ function getRealPath(filePath) { ...@@ -17955,7 +17954,7 @@ function getRealPath(filePath) {
return filePath; return filePath;
} }
// EXTERNAL MODULE: ./src/core/view/plugins/events.js + 1 modules // EXTERNAL MODULE: ./src/core/view/plugins/events.js + 1 modules
var events = __webpack_require__(11); var events = __webpack_require__(10);
// CONCATENATED MODULE: ./src/core/view/mixins/base.js // CONCATENATED MODULE: ./src/core/view/mixins/base.js
......
...@@ -2,19 +2,62 @@ import { ...@@ -2,19 +2,62 @@ import {
isPlainObject isPlainObject
} from 'uni-shared' } from 'uni-shared'
import {
V_FOR,
B_STYLE
} from '../../constants'
function setResult (data, k, v) { function setResult (data, k, v) {
data[k] = v data[k] = v
} }
function diffObject (newObj, oldObj) { function diffObject (newObj, oldObj, every = true) {
let result, key, cur, old
for (key in newObj) {
cur = newObj[key]
old = oldObj[key]
if (old !== cur) {
if (!every) {
return newObj
}
setResult(result || (result = Object.create(null)), key, cur)
}
}
return result
}
function diffArray (newArr, oldArr) {
const newLen = newArr.length
if (newLen !== oldArr.length) {
return newArr
}
if (isPlainObject(newArr[0])) {
for (let i = 0; i < newLen; i++) {
if (diffObject(newArr[i], oldArr[i], false)) {
return newArr
}
}
} else {
for (let i = 0; i < newLen; i++) {
if (newArr[i] !== oldArr[i]) {
return newArr
}
}
}
}
function diffElmData (newObj, oldObj) {
let result, key, cur, old let result, key, cur, old
for (key in newObj) { for (key in newObj) {
cur = newObj[key] cur = newObj[key]
old = oldObj[key] old = oldObj[key]
if (old !== cur) { if (old !== cur) {
if (key === 's' && isPlainObject(cur) && isPlainObject(old)) { if (key === B_STYLE && isPlainObject(cur) && isPlainObject(old)) {
const style = diffObject(cur, old) const style = diffObject(cur, old)
style && setResult(result || (result = Object.create(null)), 's', style) style && setResult(result || (result = Object.create(null)), B_STYLE, style)
} else if (key === V_FOR && Array.isArray(cur) && Array.isArray(old)) {
const vFor = diffArray(cur, old)
vFor && setResult(result || (result = Object.create(null)), V_FOR, vFor)
} else { } else {
setResult(result || (result = Object.create(null)), key, cur) setResult(result || (result = Object.create(null)), key, cur)
} }
...@@ -32,7 +75,7 @@ export function diff (newData, oldData, result) { ...@@ -32,7 +75,7 @@ export function diff (newData, oldData, result) {
setResult(result, id, cur) setResult(result, id, cur)
continue continue
} }
const idObj = diffObject(cur, old) const idObj = diffElmData(cur, old)
idObj && setResult(result, id, idObj) idObj && setResult(result, id, idObj)
} }
return result return result
......
...@@ -18,17 +18,24 @@ import { ...@@ -18,17 +18,24 @@ import {
vdSyncCallbacks vdSyncCallbacks
} from '../subscribe-handlers/on-vd-sync-callback' } from '../subscribe-handlers/on-vd-sync-callback'
function wrapperEvent (event) {
event.preventDefault = noop
event.stopPropagation = noop
event.mp = event
return Object.assign({
mp: event // mpvue
}, event)
}
const handleVdData = { const handleVdData = {
[UI_EVENT]: function onUIEvent (vdBatchEvent, vd) { [UI_EVENT]: function onUIEvent (vdBatchEvent, vd) {
vdBatchEvent.forEach(([cid, nid, event]) => { vdBatchEvent.forEach(([cid, nid, event]) => {
nid = String(nid) nid = String(nid)
event.preventDefault = noop
event.stopPropagation = noop
const target = vd.elements.find(target => target.cid === cid && target.nid === nid) const target = vd.elements.find(target => target.cid === cid && target.nid === nid)
if (!target) { if (!target) {
return console.error(`event handler[${cid}][${nid}] not found`) return console.error(`event handler[${cid}][${nid}] not found`)
} }
target.dispatchEvent(event.type, event) target.dispatchEvent(event.type, wrapperEvent(event))
}) })
} }
} }
......
...@@ -20,11 +20,11 @@ export function initEvent (Vue) { ...@@ -20,11 +20,11 @@ export function initEvent (Vue) {
} }
Vue.prototype.$handleViewEvent = function ($vueEvent, options) { Vue.prototype.$handleViewEvent = function ($vueEvent, options) {
const isCustomEvent = $vueEvent._processed // 自定义事件已提前处理过 // const isCustomEvent = $vueEvent._processed // 自定义事件已提前处理过
const $event = this.$handleEvent($vueEvent) const $event = this.$handleEvent($vueEvent)
const cid = this._$id const cid = this._$id
// 当自定义组件根节点触发事件时,nid 始终为 0 // 当自定义组件根节点触发事件时,nid 始终为 0
const nid = isCustomEvent || ($vueEvent.currentTarget === this.$el) ? 0 : $event.options.nid const nid = $vueEvent.currentTarget === this.$el ? 0 : $event.options.nid
if (typeof nid === 'undefined') { if (typeof nid === 'undefined') {
return console.error(`[${cid}] nid not found`) return console.error(`[${cid}] nid not found`)
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册