提交 8cb77614 编写于 作者: L liuxiaohang

fix(mp-toutiao): 修复 字节小程序$emit不触发 fixed #2774

上级 d5466f64
import Vue from 'vue';
import Vue from 'vue';
function b64DecodeUnicode (str) {
return decodeURIComponent(atob(str).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
......@@ -48,8 +48,8 @@ function uniIdMixin (Vue) {
} = getCurrentUserInfo();
return tokenExpired > Date.now()
};
}
}
const _toString = Object.prototype.toString;
const hasOwnProperty = Object.prototype.hasOwnProperty;
......@@ -88,8 +88,8 @@ function cached (fn) {
const camelizeRE = /-(\w)/g;
const camelize = cached((str) => {
return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '')
});
});
const HOOKS = [
'invoke',
'success',
......@@ -192,7 +192,7 @@ function queue (hooks, data) {
}
if (res === false) {
return {
then () {}
then () { }
}
}
}
......@@ -272,16 +272,20 @@ const promiseInterceptor = {
if (!isPromise(res)) {
return res
}
return res.then(res => {
return res[1]
}).catch(res => {
return res[0]
return new Promise((resolve, reject) => {
res.then(res => {
if (res[0]) {
reject(res[0]);
} else {
resolve(res[1]);
}
});
})
}
};
};
const SYNC_API_RE =
/^\$|Window$|WindowStyle$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|Window$|WindowStyle$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64|getLocale|setLocale/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -350,8 +354,8 @@ function promisify (name, api) {
}), ...params);
})))
}
}
}
const EPS = 1e-4;
const BASE_DEVICE_WIDTH = 750;
let isIOS = false;
......@@ -392,20 +396,20 @@ function upx2px (number, newDeviceWidth) {
}
}
return number < 0 ? -result : result
}
}
const interceptors = {
promiseInterceptor
};
var baseApi = /*#__PURE__*/Object.freeze({
__proto__: null,
upx2px: upx2px,
addInterceptor: addInterceptor,
removeInterceptor: removeInterceptor,
interceptors: interceptors
});
};
var baseApi = /*#__PURE__*/Object.freeze({
__proto__: null,
upx2px: upx2px,
addInterceptor: addInterceptor,
removeInterceptor: removeInterceptor,
interceptors: interceptors
});
class EventChannel {
constructor (id, events) {
this.id = id;
......@@ -472,8 +476,8 @@ class EventChannel {
type
});
}
}
}
const eventChannels = {};
const eventChannelStack = [];
......@@ -509,8 +513,8 @@ var navigateTo = {
returnValue (fromRes, toRes) {
fromRes.eventChannel = getEventChannel();
}
};
};
function findExistsPageIndex (url) {
const pages = getCurrentPages();
let len = pages.length;
......@@ -521,8 +525,8 @@ function findExistsPageIndex (url) {
}
}
return -1
}
}
var redirectTo = {
name (fromArgs) {
if (fromArgs.exists === 'back' && fromArgs.delta) {
......@@ -541,8 +545,8 @@ var redirectTo = {
}
}
}
};
};
var previewImage = {
args (fromArgs) {
let currentIndex = parseInt(fromArgs.current);
......@@ -575,8 +579,8 @@ var previewImage = {
loop: false
}
}
};
};
const UUID_KEY = '__DC_STAT_UUID';
let deviceId;
function addUuid (result) {
......@@ -608,15 +612,15 @@ var getSystemInfo = {
addUuid(result);
addSafeAreaInsets(result);
}
};
};
const oName = 'getUserInfo';
const nName = 'getUserProfile';
var getUserProfile = {
name: tt.canIUse(nName) ? nName : oName
};
};
// 不支持的 API 列表
const todos = [
'preloadPage',
......@@ -788,8 +792,8 @@ const protocols = {
digestAlgorithm: false
}
}
};
};
const CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
function processCallback (methodName, method, returnValue) {
......@@ -874,8 +878,8 @@ function wrapper (methodName, method) {
}
}
return method
}
}
const todoApis = Object.create(null);
const TODOS = [
......@@ -902,15 +906,15 @@ function createTodoApi (name) {
TODOS.forEach(function (name) {
todoApis[name] = createTodoApi(name);
});
});
var providers = {
oauth: ['toutiao'],
share: ['toutiao'],
payment: ['toutiao'],
push: ['toutiao']
};
};
function getProvider ({
service,
success,
......@@ -932,18 +936,18 @@ function getProvider ({
isFn(fail) && fail(res);
}
isFn(complete) && complete(res);
}
var extraApi = /*#__PURE__*/Object.freeze({
__proto__: null,
getProvider: getProvider
});
}
var extraApi = /*#__PURE__*/Object.freeze({
__proto__: null,
getProvider: getProvider
});
const getEmitter = (function () {
let Emitter;
return function getUniEmitter () {
if (!Emitter) {
Emitter = new Vue();
return function getUniEmitter () {
if (!Emitter) {
Emitter = new Vue();
}
return Emitter
}
......@@ -964,16 +968,16 @@ function $once () {
}
function $emit () {
return apply(getEmitter(), '$emit', [...arguments])
}
var eventApi = /*#__PURE__*/Object.freeze({
__proto__: null,
$on: $on,
$off: $off,
$once: $once,
$emit: $emit
});
}
var eventApi = /*#__PURE__*/Object.freeze({
__proto__: null,
$on: $on,
$off: $off,
$once: $once,
$emit: $emit
});
function createMediaQueryObserver () {
const mediaQueryObserver = {};
const {
......@@ -1064,13 +1068,13 @@ function createMediaQueryObserver () {
};
return mediaQueryObserver
}
var api = /*#__PURE__*/Object.freeze({
__proto__: null,
createMediaQueryObserver: createMediaQueryObserver
});
}
var api = /*#__PURE__*/Object.freeze({
__proto__: null,
createMediaQueryObserver: createMediaQueryObserver
});
const MPPage = Page;
const MPComponent = Component;
......@@ -1088,8 +1092,10 @@ function initTriggerEvent (mpInstance) {
}
function initHook (name, options, isComponent) {
// fix by Lxh 字节自定义组件Component构造器文档上写有created,但是实测只触发了lifetimes上的created
isComponent && (options = options.lifetimes)
{
// fix by Lxh 字节自定义组件Component构造器文档上写有created,但是实测只触发了lifetimes上的created
isComponent && (options = options.lifetimes);
}
const oldHook = options[name];
if (!oldHook) {
options[name] = function () {
......@@ -1114,8 +1120,8 @@ if (!MPPage.__$wrappered) {
initHook('created', options, true);
return MPComponent(options)
};
}
}
const PAGE_EVENT_HOOKS = [
'onPullDownRefresh',
'onReachBottom',
......@@ -1657,8 +1663,8 @@ function handleEvent (event) {
) {
return ret[0]
}
}
}
const hooks = [
'onShow',
'onHide',
......@@ -1818,8 +1824,8 @@ function parseBaseApp (vm, {
initHooks(appOptions, hooks);
return appOptions
}
}
function findVmByVueId (vm, vuePid) {
const $children = vm.$children;
// 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
......@@ -1860,8 +1866,8 @@ function handleLink (event) {
}
vueOptions.parent = parentVm;
}
}
const mocks = ['__route__', '__webviewId__', '__nodeid__', '__nodeId__'];
function isPage () {
......@@ -1961,8 +1967,8 @@ function handleLink$1 ({
vm._isMounted = true;
vm.__call_hook('mounted');
vm.__call_hook('onReady');
}
}
function parseApp (vm) {
Vue.prototype._$fallback = true; // 降级(调整原 vue 的部分生命周期,如 created,beforeMount,inject,provide)
......@@ -1989,13 +1995,13 @@ function parseApp (vm) {
mocks,
initRefs: function () {} // attached 时,可能查询不到
})
}
}
function createApp (vm) {
App(parseApp(vm));
return vm
}
}
const encodeReserveRE = /[!'()*]/g;
const encodeReserveReplacer = c => '%' + c.charCodeAt(0).toString(16);
const commaRE = /%2C/g;
......@@ -2037,8 +2043,8 @@ function stringifyQuery (obj, encodeStr = encode) {
return encodeStr(key) + '=' + encodeStr(val)
}).filter(x => x.length > 0).join('&') : null;
return res ? `?${res}` : ''
}
}
function parseBaseComponent (vueComponentOptions, {
isPage,
initRelation
......@@ -2129,8 +2135,8 @@ function parseBaseComponent (vueComponentOptions, {
return componentOptions
}
return [componentOptions, VueComponent]
}
}
const components = [];
function parseComponent (vueOptions) {
......@@ -2183,8 +2189,8 @@ function parseComponent (vueOptions) {
componentOptions.methods.__l = handleLink$1;
return componentOptions
}
}
const hooks$1 = [
'onShow',
'onHide',
......@@ -2213,8 +2219,8 @@ function parseBasePage (vuePageOptions, {
};
return pageOptions
}
}
function parsePage (vuePageOptions) {
const pageOptions = parseBasePage(vuePageOptions, {
isPage,
......@@ -2231,34 +2237,34 @@ function parsePage (vuePageOptions) {
} else {
this.is && console.warn(this.is + ' is not ready');
}
};
pageOptions.lifetimes.detached = function detached () {
this.$vm && this.$vm.$destroy();
// 清理
const webviewId = this.__webviewId__;
webviewId && Object.keys(instances).forEach(key => {
if (key.indexOf(webviewId + '_') === 0) {
delete instances[key];
}
});
};
pageOptions.lifetimes.detached = function detached () {
this.$vm && this.$vm.$destroy();
// 清理
const webviewId = this.__webviewId__;
webviewId && Object.keys(instances).forEach(key => {
if (key.indexOf(webviewId + '_') === 0) {
delete instances[key];
}
});
};
return pageOptions
}
}
function createPage (vuePageOptions) {
{
return Component(parsePage(vuePageOptions))
}
}
}
function createComponent (vueOptions) {
{
return Component(parseComponent(vueOptions))
}
}
}
function createSubpackageApp (vm) {
const appOptions = parseApp(vm);
const app = getApp({
......@@ -2293,8 +2299,8 @@ function createSubpackageApp (vm) {
vm.__call_hook('onLaunch', args);
}
return vm
}
}
function createPlugin (vm) {
const appOptions = parseApp(vm);
if (isFn(appOptions.onShow) && tt.onAppShow) {
......@@ -2312,8 +2318,8 @@ function createPlugin (vm) {
appOptions.onLaunch.call(vm, args);
}
return vm
}
}
todos.forEach(todoApi => {
protocols[todoApi] = false;
});
......@@ -2396,7 +2402,7 @@ tt.createComponent = createComponent;
tt.createSubpackageApp = createSubpackageApp;
tt.createPlugin = createPlugin;
var uni$1 = uni;
export default uni$1;
export { createApp, createComponent, createPage, createPlugin, createSubpackageApp };
var uni$1 = uni;
export default uni$1;
export { createApp, createComponent, createPage, createPlugin, createSubpackageApp };
......@@ -24,7 +24,11 @@ function initTriggerEvent (mpInstance) {
}
}
function initHook (name, options) {
function initHook (name, options, isComponent) {
if (__PLATFORM__ === 'mp-toutiao') {
// fix by Lxh 字节自定义组件Component构造器文档上写有created,但是实测只触发了lifetimes上的created
isComponent && (options = options.lifetimes)
}
const oldHook = options[name]
if (!oldHook) {
options[name] = function () {
......@@ -46,7 +50,7 @@ if (!MPPage.__$wrappered) {
Page.after = MPPage.after
Component = function (options = {}) {
initHook('created', options)
initHook('created', options, true)
return MPComponent(options)
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册