| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559 |
- import Vue from 'vue';
- const _toString = Object.prototype.toString;
- const hasOwnProperty = Object.prototype.hasOwnProperty;
- function isFn (fn) {
- return typeof fn === 'function'
- }
- function isStr (str) {
- return typeof str === 'string'
- }
- function isPlainObject (obj) {
- return _toString.call(obj) === '[object Object]'
- }
- function hasOwn (obj, key) {
- return hasOwnProperty.call(obj, key)
- }
- function noop () {}
- /**
- * Create a cached version of a pure function.
- */
- function cached (fn) {
- const cache = Object.create(null);
- return function cachedFn (str) {
- const hit = cache[str];
- return hit || (cache[str] = fn(str))
- }
- }
- /**
- * Camelize a hyphen-delimited string.
- */
- const camelizeRE = /-(\w)/g;
- const camelize = cached((str) => {
- return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '')
- });
- const HOOKS = [
- 'invoke',
- 'success',
- 'fail',
- 'complete',
- 'returnValue'
- ];
- const globalInterceptors = {};
- const scopedInterceptors = {};
- function mergeHook (parentVal, childVal) {
- const res = childVal
- ? parentVal
- ? parentVal.concat(childVal)
- : Array.isArray(childVal)
- ? childVal : [childVal]
- : parentVal;
- return res
- ? dedupeHooks(res)
- : res
- }
- function dedupeHooks (hooks) {
- const res = [];
- for (let i = 0; i < hooks.length; i++) {
- if (res.indexOf(hooks[i]) === -1) {
- res.push(hooks[i]);
- }
- }
- return res
- }
- function removeHook (hooks, hook) {
- const index = hooks.indexOf(hook);
- if (index !== -1) {
- hooks.splice(index, 1);
- }
- }
- function mergeInterceptorHook (interceptor, option) {
- Object.keys(option).forEach(hook => {
- if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
- interceptor[hook] = mergeHook(interceptor[hook], option[hook]);
- }
- });
- }
- function removeInterceptorHook (interceptor, option) {
- if (!interceptor || !option) {
- return
- }
- Object.keys(option).forEach(hook => {
- if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
- removeHook(interceptor[hook], option[hook]);
- }
- });
- }
- function addInterceptor (method, option) {
- if (typeof method === 'string' && isPlainObject(option)) {
- mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), option);
- } else if (isPlainObject(method)) {
- mergeInterceptorHook(globalInterceptors, method);
- }
- }
- function removeInterceptor (method, option) {
- if (typeof method === 'string') {
- if (isPlainObject(option)) {
- removeInterceptorHook(scopedInterceptors[method], option);
- } else {
- delete scopedInterceptors[method];
- }
- } else if (isPlainObject(method)) {
- removeInterceptorHook(globalInterceptors, method);
- }
- }
- function wrapperHook (hook) {
- return function (data) {
- return hook(data) || data
- }
- }
- function isPromise (obj) {
- return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'
- }
- function queue (hooks, data) {
- let promise = false;
- for (let i = 0; i < hooks.length; i++) {
- const hook = hooks[i];
- if (promise) {
- promise = Promise.then(wrapperHook(hook));
- } else {
- const res = hook(data);
- if (isPromise(res)) {
- promise = Promise.resolve(res);
- }
- if (res === false) {
- return {
- then () {}
- }
- }
- }
- }
- return promise || {
- then (callback) {
- return callback(data)
- }
- }
- }
- function wrapperOptions (interceptor, options = {}) {
- ['success', 'fail', 'complete'].forEach(name => {
- if (Array.isArray(interceptor[name])) {
- const oldCallback = options[name];
- options[name] = function callbackInterceptor (res) {
- queue(interceptor[name], res).then((res) => {
- /* eslint-disable no-mixed-operators */
- return isFn(oldCallback) && oldCallback(res) || res
- });
- };
- }
- });
- return options
- }
- function wrapperReturnValue (method, returnValue) {
- const returnValueHooks = [];
- if (Array.isArray(globalInterceptors.returnValue)) {
- returnValueHooks.push(...globalInterceptors.returnValue);
- }
- const interceptor = scopedInterceptors[method];
- if (interceptor && Array.isArray(interceptor.returnValue)) {
- returnValueHooks.push(...interceptor.returnValue);
- }
- returnValueHooks.forEach(hook => {
- returnValue = hook(returnValue) || returnValue;
- });
- return returnValue
- }
- function getApiInterceptorHooks (method) {
- const interceptor = Object.create(null);
- Object.keys(globalInterceptors).forEach(hook => {
- if (hook !== 'returnValue') {
- interceptor[hook] = globalInterceptors[hook].slice();
- }
- });
- const scopedInterceptor = scopedInterceptors[method];
- if (scopedInterceptor) {
- Object.keys(scopedInterceptor).forEach(hook => {
- if (hook !== 'returnValue') {
- interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
- }
- });
- }
- return interceptor
- }
- function invokeApi (method, api, options, ...params) {
- const interceptor = getApiInterceptorHooks(method);
- if (interceptor && Object.keys(interceptor).length) {
- if (Array.isArray(interceptor.invoke)) {
- const res = queue(interceptor.invoke, options);
- return res.then((options) => {
- return api(wrapperOptions(interceptor, options), ...params)
- })
- } else {
- return api(wrapperOptions(interceptor, options), ...params)
- }
- }
- return api(options, ...params)
- }
- const promiseInterceptor = {
- returnValue (res) {
- if (!isPromise(res)) {
- return res
- }
- return res.then(res => {
- return res[1]
- }).catch(res => {
- return res[0]
- })
- }
- };
- const SYNC_API_RE =
- /^\$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
- const CONTEXT_API_RE = /^create|Manager$/;
- // Context例外情况
- const CONTEXT_API_RE_EXC = ['createBLEConnection'];
- // 同步例外情况
- const ASYNC_API = ['createBLEConnection'];
- const CALLBACK_API_RE = /^on|^off/;
- function isContextApi (name) {
- return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1
- }
- function isSyncApi (name) {
- return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1
- }
- function isCallbackApi (name) {
- return CALLBACK_API_RE.test(name) && name !== 'onPush'
- }
- function handlePromise (promise) {
- return promise.then(data => {
- return [null, data]
- })
- .catch(err => [err])
- }
- function shouldPromise (name) {
- if (
- isContextApi(name) ||
- isSyncApi(name) ||
- isCallbackApi(name)
- ) {
- return false
- }
- return true
- }
- /* eslint-disable no-extend-native */
- if (!Promise.prototype.finally) {
- Promise.prototype.finally = function (callback) {
- const promise = this.constructor;
- return this.then(
- value => promise.resolve(callback()).then(() => value),
- reason => promise.resolve(callback()).then(() => {
- throw reason
- })
- )
- };
- }
- function promisify (name, api) {
- if (!shouldPromise(name)) {
- return api
- }
- return function promiseApi (options = {}, ...params) {
- if (isFn(options.success) || isFn(options.fail) || isFn(options.complete)) {
- return wrapperReturnValue(name, invokeApi(name, api, options, ...params))
- }
- return wrapperReturnValue(name, handlePromise(new Promise((resolve, reject) => {
- invokeApi(name, api, Object.assign({}, options, {
- success: resolve,
- fail: reject
- }), ...params);
- })))
- }
- }
- const EPS = 1e-4;
- const BASE_DEVICE_WIDTH = 750;
- let isIOS = false;
- let deviceWidth = 0;
- let deviceDPR = 0;
- function checkDeviceWidth () {
- const {
- platform,
- pixelRatio,
- windowWidth
- } = wx.getSystemInfoSync(); // uni=>wx runtime 编译目标是 uni 对象,内部不允许直接使用 uni
- deviceWidth = windowWidth;
- deviceDPR = pixelRatio;
- isIOS = platform === 'ios';
- }
- function upx2px (number, newDeviceWidth) {
- if (deviceWidth === 0) {
- checkDeviceWidth();
- }
- number = Number(number);
- if (number === 0) {
- return 0
- }
- let result = (number / BASE_DEVICE_WIDTH) * (newDeviceWidth || deviceWidth);
- if (result < 0) {
- result = -result;
- }
- result = Math.floor(result + EPS);
- if (result === 0) {
- if (deviceDPR === 1 || !isIOS) {
- return 1
- } else {
- return 0.5
- }
- }
- return number < 0 ? -result : result
- }
- const interceptors = {
- promiseInterceptor
- };
- var baseApi = /*#__PURE__*/Object.freeze({
- __proto__: null,
- upx2px: upx2px,
- addInterceptor: addInterceptor,
- removeInterceptor: removeInterceptor,
- interceptors: interceptors
- });
- const protocols = {};
- const todos = [];
- const canIUses = [];
- const CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
- function processCallback (methodName, method, returnValue) {
- return function (res) {
- return method(processReturnValue(methodName, res, returnValue))
- }
- }
- function processArgs (methodName, fromArgs, argsOption = {}, returnValue = {}, keepFromArgs = false) {
- if (isPlainObject(fromArgs)) { // 一般 api 的参数解析
- const toArgs = keepFromArgs === true ? fromArgs : {}; // returnValue 为 false 时,说明是格式化返回值,直接在返回值对象上修改赋值
- if (isFn(argsOption)) {
- argsOption = argsOption(fromArgs, toArgs) || {};
- }
- for (const key in fromArgs) {
- if (hasOwn(argsOption, key)) {
- let keyOption = argsOption[key];
- if (isFn(keyOption)) {
- keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
- }
- if (!keyOption) { // 不支持的参数
- console.warn(`app-plus ${methodName}暂不支持${key}`);
- } else if (isStr(keyOption)) { // 重写参数 key
- toArgs[keyOption] = fromArgs[key];
- } else if (isPlainObject(keyOption)) { // {name:newName,value:value}可重新指定参数 key:value
- toArgs[keyOption.name ? keyOption.name : key] = keyOption.value;
- }
- } else if (CALLBACKS.indexOf(key) !== -1) {
- toArgs[key] = processCallback(methodName, fromArgs[key], returnValue);
- } else {
- if (!keepFromArgs) {
- toArgs[key] = fromArgs[key];
- }
- }
- }
- return toArgs
- } else if (isFn(fromArgs)) {
- fromArgs = processCallback(methodName, fromArgs, returnValue);
- }
- return fromArgs
- }
- function processReturnValue (methodName, res, returnValue, keepReturnValue = false) {
- if (isFn(protocols.returnValue)) { // 处理通用 returnValue
- res = protocols.returnValue(methodName, res);
- }
- return processArgs(methodName, res, returnValue, {}, keepReturnValue)
- }
- function wrapper (methodName, method) {
- if (hasOwn(protocols, methodName)) {
- const protocol = protocols[methodName];
- if (!protocol) { // 暂不支持的 api
- return function () {
- console.error(`app-plus 暂不支持${methodName}`);
- }
- }
- return function (arg1, arg2) { // 目前 api 最多两个参数
- let options = protocol;
- if (isFn(protocol)) {
- options = protocol(arg1);
- }
- arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
- const args = [arg1];
- if (typeof arg2 !== 'undefined') {
- args.push(arg2);
- }
- const returnValue = wx[options.name || methodName].apply(wx, args);
- if (isSyncApi(methodName)) { // 同步 api
- return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName))
- }
- return returnValue
- }
- }
- return method
- }
- const todoApis = Object.create(null);
- const TODOS = [
- 'onTabBarMidButtonTap',
- 'subscribePush',
- 'unsubscribePush',
- 'onPush',
- 'offPush',
- 'share'
- ];
- function createTodoApi (name) {
- return function todoApi ({
- fail,
- complete
- }) {
- const res = {
- errMsg: `${name}:fail:暂不支持 ${name} 方法`
- };
- isFn(fail) && fail(res);
- isFn(complete) && complete(res);
- }
- }
- TODOS.forEach(function (name) {
- todoApis[name] = createTodoApi(name);
- });
- const getEmitter = (function () {
- if (typeof getUniEmitter === 'function') {
- /* eslint-disable no-undef */
- return getUniEmitter
- }
- let Emitter;
- return function getUniEmitter () {
- if (!Emitter) {
- Emitter = new Vue();
- }
- return Emitter
- }
- })();
- function apply (ctx, method, args) {
- return ctx[method].apply(ctx, args)
- }
- function $on () {
- return apply(getEmitter(), '$on', [...arguments])
- }
- function $off () {
- return apply(getEmitter(), '$off', [...arguments])
- }
- function $once () {
- return apply(getEmitter(), '$once', [...arguments])
- }
- function $emit () {
- return apply(getEmitter(), '$emit', [...arguments])
- }
- var eventApi = /*#__PURE__*/Object.freeze({
- __proto__: null,
- $on: $on,
- $off: $off,
- $once: $once,
- $emit: $emit
- });
- function requireNativePlugin (pluginName) {
- /* eslint-disable no-undef */
- if (typeof weex !== 'undefined') {
- return weex.requireModule(pluginName)
- }
- /* eslint-disable no-undef */
- return __requireNativePlugin__(pluginName)
- }
- function wrapper$1 (webview) {
- webview.$processed = true;
- webview.postMessage = function (data) {
- plus.webview.postMessageToUniNView({
- type: 'UniAppSubNVue',
- data
- }, webview.id);
- };
- let callbacks = [];
- webview.onMessage = function (callback) {
- callbacks.push(callback);
- };
- webview.$consumeMessage = function (e) {
- callbacks.forEach(callback => callback(e));
- };
- if (!webview.__uniapp_mask_id) {
- return
- }
- const maskColor = webview.__uniapp_mask;
- const maskWebview = webview.__uniapp_mask_id === '0' ? {
- setStyle ({
- mask
- }) {
- requireNativePlugin('uni-tabview').setMask({
- color: mask
- });
- }
- } : plus.webview.getWebviewById(webview.__uniapp_mask_id);
- const oldShow = webview.show;
- const oldHide = webview.hide;
- const oldClose = webview.close;
- const showMask = function () {
- maskWebview.setStyle({
- mask: maskColor
- });
- };
- const closeMask = function () {
- maskWebview.setStyle({
- mask: 'none'
- });
- };
- webview.show = function (...args) {
- showMask();
- return oldShow.apply(webview, args)
- };
- webview.hide = function (...args) {
- closeMask();
- return oldHide.apply(webview, args)
- };
- webview.close = function (...args) {
- closeMask();
- callbacks = [];
- return oldClose.apply(webview, args)
- };
- }
- function getSubNVueById (id) {
- const webview = plus.webview.getWebviewById(id);
- if (webview && !webview.$processed) {
- wrapper$1(webview);
- }
- return webview
- }
- var api = /*#__PURE__*/Object.freeze({
- __proto__: null,
- getSubNVueById: getSubNVueById,
- requireNativePlugin: requireNativePlugin
- });
- const MPPage = Page;
- const MPComponent = Component;
- const customizeRE = /:/g;
- const customize = cached((str) => {
- return camelize(str.replace(customizeRE, '-'))
- });
- function initTriggerEvent (mpInstance) {
- {
- if (!wx.canIUse('nextTick')) {
- return
- }
- }
- const oldTriggerEvent = mpInstance.triggerEvent;
- mpInstance.triggerEvent = function (event, ...args) {
- return oldTriggerEvent.apply(mpInstance, [customize(event), ...args])
- };
- }
- function initHook (name, options) {
- const oldHook = options[name];
- if (!oldHook) {
- options[name] = function () {
- initTriggerEvent(this);
- };
- } else {
- options[name] = function (...args) {
- initTriggerEvent(this);
- return oldHook.apply(this, args)
- };
- }
- }
- Page = function (options = {}) {
- initHook('onLoad', options);
- return MPPage(options)
- };
- Component = function (options = {}) {
- initHook('created', options);
- return MPComponent(options)
- };
- const PAGE_EVENT_HOOKS = [
- 'onPullDownRefresh',
- 'onReachBottom',
- 'onShareAppMessage',
- 'onPageScroll',
- 'onResize',
- 'onTabItemTap'
- ];
- function initMocks (vm, mocks) {
- const mpInstance = vm.$mp[vm.mpType];
- mocks.forEach(mock => {
- if (hasOwn(mpInstance, mock)) {
- vm[mock] = mpInstance[mock];
- }
- });
- }
- function hasHook (hook, vueOptions) {
- if (!vueOptions) {
- return true
- }
- if (Vue.options && Array.isArray(Vue.options[hook])) {
- return true
- }
- vueOptions = vueOptions.default || vueOptions;
- if (isFn(vueOptions)) {
- if (isFn(vueOptions.extendOptions[hook])) {
- return true
- }
- if (vueOptions.super &&
- vueOptions.super.options &&
- Array.isArray(vueOptions.super.options[hook])) {
- return true
- }
- return false
- }
- if (isFn(vueOptions[hook])) {
- return true
- }
- const mixins = vueOptions.mixins;
- if (Array.isArray(mixins)) {
- return !!mixins.find(mixin => hasHook(hook, mixin))
- }
- }
- function initHooks (mpOptions, hooks, vueOptions) {
- hooks.forEach(hook => {
- if (hasHook(hook, vueOptions)) {
- mpOptions[hook] = function (args) {
- return this.$vm && this.$vm.__call_hook(hook, args)
- };
- }
- });
- }
- function initVueComponent (Vue, vueOptions) {
- vueOptions = vueOptions.default || vueOptions;
- let VueComponent;
- if (isFn(vueOptions)) {
- VueComponent = vueOptions;
- } else {
- VueComponent = Vue.extend(vueOptions);
- }
- vueOptions = VueComponent.options;
- return [VueComponent, vueOptions]
- }
- function initSlots (vm, vueSlots) {
- if (Array.isArray(vueSlots) && vueSlots.length) {
- const $slots = Object.create(null);
- vueSlots.forEach(slotName => {
- $slots[slotName] = true;
- });
- vm.$scopedSlots = vm.$slots = $slots;
- }
- }
- function initVueIds (vueIds, mpInstance) {
- vueIds = (vueIds || '').split(',');
- const len = vueIds.length;
- if (len === 1) {
- mpInstance._$vueId = vueIds[0];
- } else if (len === 2) {
- mpInstance._$vueId = vueIds[0];
- mpInstance._$vuePid = vueIds[1];
- }
- }
- function initData (vueOptions, context) {
- let data = vueOptions.data || {};
- const methods = vueOptions.methods || {};
- if (typeof data === 'function') {
- try {
- data = data.call(context); // 支持 Vue.prototype 上挂的数据
- } catch (e) {
- if (process.env.VUE_APP_DEBUG) {
- console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data);
- }
- }
- } else {
- try {
- // 对 data 格式化
- data = JSON.parse(JSON.stringify(data));
- } catch (e) {}
- }
- if (!isPlainObject(data)) {
- data = {};
- }
- Object.keys(methods).forEach(methodName => {
- if (context.__lifecycle_hooks__.indexOf(methodName) === -1 && !hasOwn(data, methodName)) {
- data[methodName] = methods[methodName];
- }
- });
- return data
- }
- const PROP_TYPES = [String, Number, Boolean, Object, Array, null];
- function createObserver (name) {
- return function observer (newVal, oldVal) {
- if (this.$vm) {
- this.$vm[name] = newVal; // 为了触发其他非 render watcher
- }
- }
- }
- function initBehaviors (vueOptions, initBehavior) {
- const vueBehaviors = vueOptions.behaviors;
- const vueExtends = vueOptions.extends;
- const vueMixins = vueOptions.mixins;
- let vueProps = vueOptions.props;
- if (!vueProps) {
- vueOptions.props = vueProps = [];
- }
- const behaviors = [];
- if (Array.isArray(vueBehaviors)) {
- vueBehaviors.forEach(behavior => {
- behaviors.push(behavior.replace('uni://', `${"wx"}://`));
- if (behavior === 'uni://form-field') {
- if (Array.isArray(vueProps)) {
- vueProps.push('name');
- vueProps.push('value');
- } else {
- vueProps.name = {
- type: String,
- default: ''
- };
- vueProps.value = {
- type: [String, Number, Boolean, Array, Object, Date],
- default: ''
- };
- }
- }
- });
- }
- if (isPlainObject(vueExtends) && vueExtends.props) {
- behaviors.push(
- initBehavior({
- properties: initProperties(vueExtends.props, true)
- })
- );
- }
- if (Array.isArray(vueMixins)) {
- vueMixins.forEach(vueMixin => {
- if (isPlainObject(vueMixin) && vueMixin.props) {
- behaviors.push(
- initBehavior({
- properties: initProperties(vueMixin.props, true)
- })
- );
- }
- });
- }
- return behaviors
- }
- function parsePropType (key, type, defaultValue, file) {
- // [String]=>String
- if (Array.isArray(type) && type.length === 1) {
- return type[0]
- }
- return type
- }
- function initProperties (props, isBehavior = false, file = '') {
- const properties = {};
- if (!isBehavior) {
- properties.vueId = {
- type: String,
- value: ''
- };
- properties.vueSlots = { // 小程序不能直接定义 $slots 的 props,所以通过 vueSlots 转换到 $slots
- type: null,
- value: [],
- observer: function (newVal, oldVal) {
- const $slots = Object.create(null);
- newVal.forEach(slotName => {
- $slots[slotName] = true;
- });
- this.setData({
- $slots
- });
- }
- };
- }
- if (Array.isArray(props)) { // ['title']
- props.forEach(key => {
- properties[key] = {
- type: null,
- observer: createObserver(key)
- };
- });
- } else if (isPlainObject(props)) { // {title:{type:String,default:''},content:String}
- Object.keys(props).forEach(key => {
- const opts = props[key];
- if (isPlainObject(opts)) { // title:{type:String,default:''}
- let value = opts.default;
- if (isFn(value)) {
- value = value();
- }
- opts.type = parsePropType(key, opts.type);
- properties[key] = {
- type: PROP_TYPES.indexOf(opts.type) !== -1 ? opts.type : null,
- value,
- observer: createObserver(key)
- };
- } else { // content:String
- const type = parsePropType(key, opts);
- properties[key] = {
- type: PROP_TYPES.indexOf(type) !== -1 ? type : null,
- observer: createObserver(key)
- };
- }
- });
- }
- return properties
- }
- function wrapper$2 (event) {
- // TODO 又得兼容 mpvue 的 mp 对象
- try {
- event.mp = JSON.parse(JSON.stringify(event));
- } catch (e) {}
- event.stopPropagation = noop;
- event.preventDefault = noop;
- event.target = event.target || {};
- if (!hasOwn(event, 'detail')) {
- event.detail = {};
- }
- if (hasOwn(event, 'markerId')) {
- event.detail = typeof event.detail === 'object' ? event.detail : {};
- event.detail.markerId = event.markerId;
- }
- if (isPlainObject(event.detail)) {
- event.target = Object.assign({}, event.target, event.detail);
- }
- return event
- }
- 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, event) {
- 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 {
- if (dataPath === '$event') { // $event
- extraObj['$' + index] = event;
- } else if (dataPath.indexOf('$event.') === 0) { // $event.target.value
- extraObj['$' + index] = vm.__get_value(dataPath.replace('$event.', ''), event);
- } else {
- extraObj['$' + index] = vm.__get_value(dataPath);
- }
- }
- } else {
- extraObj['$' + index] = getExtraValue(vm, dataPath);
- }
- });
- }
- return extraObj
- }
- function getObjByArray (arr) {
- const obj = {};
- for (let i = 1; i < arr.length; i++) {
- const element = arr[i];
- obj[element[0]] = element[1];
- }
- return obj
- }
- function processEventArgs (vm, event, args = [], extra = [], isCustom, methodName) {
- let isCustomMPEvent = false; // wxcomponent 组件,传递原始 event 对象
- if (isCustom) { // 自定义事件
- isCustomMPEvent = event.currentTarget &&
- event.currentTarget.dataset &&
- event.currentTarget.dataset.comType === 'wx';
- if (!args.length) { // 无参数,直接传入 event 或 detail 数组
- if (isCustomMPEvent) {
- return [event]
- }
- return event.detail.__args__ || event.detail
- }
- }
- const extraObj = processEventExtra(vm, extra, event);
- const ret = [];
- args.forEach(arg => {
- if (arg === '$event') {
- if (methodName === '__set_model' && !isCustom) { // input v-model value
- ret.push(event.target.value);
- } else {
- if (isCustom && !isCustomMPEvent) {
- ret.push(event.detail.__args__[0]);
- } else { // wxcomponent 组件或内置组件
- ret.push(event);
- }
- }
- } else {
- if (Array.isArray(arg) && arg[0] === 'o') {
- ret.push(getObjByArray(arg));
- } else if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
- ret.push(extraObj[arg]);
- } else {
- ret.push(arg);
- }
- }
- });
- return ret
- }
- const ONCE = '~';
- const CUSTOM = '^';
- function isMatchEventType (eventType, optType) {
- return (eventType === optType) ||
- (
- optType === 'regionchange' &&
- (
- eventType === 'begin' ||
- eventType === 'end'
- )
- )
- }
- function handleEvent (event) {
- event = wrapper$2(event);
- // [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]]
- const dataset = (event.currentTarget || event.target).dataset;
- if (!dataset) {
- return console.warn('事件信息不存在')
- }
- const eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰
- if (!eventOpts) {
- return console.warn('事件信息不存在')
- }
- // [['handle',[1,2,a]],['handle1',[1,2,a]]]
- const eventType = event.type;
- const ret = [];
- eventOpts.forEach(eventOpt => {
- let type = eventOpt[0];
- const eventsArray = eventOpt[1];
- const isCustom = type.charAt(0) === CUSTOM;
- type = isCustom ? type.slice(1) : type;
- const isOnce = type.charAt(0) === ONCE;
- type = isOnce ? type.slice(1) : type;
- if (eventsArray && isMatchEventType(eventType, type)) {
- eventsArray.forEach(eventArray => {
- const methodName = eventArray[0];
- if (methodName) {
- let handlerCtx = this.$vm;
- if (
- handlerCtx.$options.generic &&
- handlerCtx.$parent &&
- handlerCtx.$parent.$parent
- ) { // mp-weixin,mp-toutiao 抽象节点模拟 scoped slots
- handlerCtx = handlerCtx.$parent.$parent;
- }
- if (methodName === '$emit') {
- handlerCtx.$emit.apply(handlerCtx,
- processEventArgs(
- this.$vm,
- event,
- eventArray[1],
- eventArray[2],
- isCustom,
- methodName
- ));
- return
- }
- const handler = handlerCtx[methodName];
- if (!isFn(handler)) {
- throw new Error(` _vm.${methodName} is not a function`)
- }
- if (isOnce) {
- if (handler.once) {
- return
- }
- handler.once = true;
- }
- ret.push(handler.apply(handlerCtx, processEventArgs(
- this.$vm,
- event,
- eventArray[1],
- eventArray[2],
- isCustom,
- methodName
- )));
- }
- });
- }
- });
- if (
- eventType === 'input' &&
- ret.length === 1 &&
- typeof ret[0] !== 'undefined'
- ) {
- return ret[0]
- }
- }
- const hooks = [
- 'onShow',
- 'onHide',
- 'onError',
- 'onPageNotFound'
- ];
- function parseBaseApp (vm, {
- mocks,
- initRefs
- }) {
- if (vm.$options.store) {
- Vue.prototype.$store = vm.$options.store;
- }
- Vue.prototype.mpHost = "app-plus";
- Vue.mixin({
- beforeCreate () {
- if (!this.$options.mpType) {
- return
- }
- this.mpType = this.$options.mpType;
- this.$mp = {
- data: {},
- [this.mpType]: this.$options.mpInstance
- };
- this.$scope = this.$options.mpInstance;
- delete this.$options.mpType;
- delete this.$options.mpInstance;
- if (this.mpType !== 'app') {
- initRefs(this);
- initMocks(this, mocks);
- }
- }
- });
- const appOptions = {
- onLaunch (args) {
- if (this.$vm) { // 已经初始化过了,主要是为了百度,百度 onShow 在 onLaunch 之前
- return
- }
- this.$vm = vm;
- this.$vm.$mp = {
- app: this
- };
- this.$vm.$scope = this;
- // vm 上也挂载 globalData
- this.$vm.globalData = this.globalData;
- this.$vm._isMounted = true;
- this.$vm.__call_hook('mounted', args);
- this.$vm.__call_hook('onLaunch', args);
- }
- };
- // 兼容旧版本 globalData
- appOptions.globalData = vm.$options.globalData || {};
- // 将 methods 中的方法挂在 getApp() 中
- const methods = vm.$options.methods;
- if (methods) {
- Object.keys(methods).forEach(name => {
- appOptions[name] = methods[name];
- });
- }
- initHooks(appOptions, hooks);
- return appOptions
- }
- const mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__'];
- function findVmByVueId (vm, vuePid) {
- const $children = vm.$children;
- // 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
- for (let i = $children.length - 1; i >= 0; i--) {
- const childVm = $children[i];
- if (childVm.$scope._$vueId === vuePid) {
- return childVm
- }
- }
- // 反向递归查找
- let parentVm;
- for (let i = $children.length - 1; i >= 0; i--) {
- parentVm = findVmByVueId($children[i], vuePid);
- if (parentVm) {
- return parentVm
- }
- }
- }
- function initBehavior (options) {
- return Behavior(options)
- }
- function isPage () {
- return !!this.route
- }
- function initRelation (detail) {
- this.triggerEvent('__l', detail);
- }
- function initRefs (vm) {
- const mpInstance = vm.$scope;
- Object.defineProperty(vm, '$refs', {
- get () {
- const $refs = {};
- const components = mpInstance.selectAllComponents('.vue-ref');
- components.forEach(component => {
- const ref = component.dataset.ref;
- $refs[ref] = component.$vm || component;
- });
- const forComponents = mpInstance.selectAllComponents('.vue-ref-in-for');
- forComponents.forEach(component => {
- const ref = component.dataset.ref;
- if (!$refs[ref]) {
- $refs[ref] = [];
- }
- $refs[ref].push(component.$vm || component);
- });
- return $refs
- }
- });
- }
- function handleLink (event) {
- const {
- vuePid,
- vueOptions
- } = event.detail || event.value; // detail 是微信,value 是百度(dipatch)
- let parentVm;
- if (vuePid) {
- parentVm = findVmByVueId(this.$vm, vuePid);
- }
- if (!parentVm) {
- parentVm = this.$vm;
- }
- vueOptions.parent = parentVm;
- }
- function parseApp (vm) {
- return parseBaseApp(vm, {
- mocks,
- initRefs
- })
- }
- const hooks$1 = [
- 'onUniNViewMessage'
- ];
- function parseApp$1 (vm) {
- const appOptions = parseApp(vm);
- initHooks(appOptions, hooks$1);
- return appOptions
- }
- function createApp (vm) {
- App(parseApp$1(vm));
- return vm
- }
- function parseBaseComponent (vueComponentOptions, {
- isPage,
- initRelation
- } = {}) {
- const [VueComponent, vueOptions] = initVueComponent(Vue, vueComponentOptions);
- const options = {
- multipleSlots: true,
- addGlobalClass: true,
- ...(vueOptions.options || {})
- };
- const componentOptions = {
- options,
- data: initData(vueOptions, Vue.prototype),
- behaviors: initBehaviors(vueOptions, initBehavior),
- properties: initProperties(vueOptions.props, false, vueOptions.__file),
- lifetimes: {
- attached () {
- const properties = this.properties;
- const options = {
- mpType: isPage.call(this) ? 'page' : 'component',
- mpInstance: this,
- propsData: properties
- };
- initVueIds(properties.vueId, this);
- // 处理父子关系
- initRelation.call(this, {
- vuePid: this._$vuePid,
- vueOptions: options
- });
- // 初始化 vue 实例
- this.$vm = new VueComponent(options);
- // 处理$slots,$scopedSlots(暂不支持动态变化$slots)
- initSlots(this.$vm, properties.vueSlots);
- // 触发首次 setData
- this.$vm.$mount();
- },
- ready () {
- // 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
- // https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
- if (this.$vm) {
- this.$vm._isMounted = true;
- this.$vm.__call_hook('mounted');
- this.$vm.__call_hook('onReady');
- }
- },
- detached () {
- this.$vm && this.$vm.$destroy();
- }
- },
- pageLifetimes: {
- show (args) {
- this.$vm && this.$vm.__call_hook('onPageShow', args);
- },
- hide () {
- this.$vm && this.$vm.__call_hook('onPageHide');
- },
- resize (size) {
- this.$vm && this.$vm.__call_hook('onPageResize', size);
- }
- },
- methods: {
- __l: handleLink,
- __e: handleEvent
- }
- };
- // externalClasses
- if (vueOptions.externalClasses) {
- componentOptions.externalClasses = vueOptions.externalClasses;
- }
- if (Array.isArray(vueOptions.wxsCallMethods)) {
- vueOptions.wxsCallMethods.forEach(callMethod => {
- componentOptions.methods[callMethod] = function (args) {
- return this.$vm[callMethod](args)
- };
- });
- }
- if (isPage) {
- return componentOptions
- }
- return [componentOptions, VueComponent]
- }
- function parseComponent (vueComponentOptions) {
- return parseBaseComponent(vueComponentOptions, {
- isPage,
- initRelation
- })
- }
- function parseComponent$1 (vueComponentOptions) {
- const componentOptions = parseComponent(vueComponentOptions);
- componentOptions.methods.$getAppWebview = function () {
- return plus.webview.getWebviewById(`${this.__wxWebviewId__}`)
- };
- return componentOptions
- }
- const hooks$2 = [
- 'onShow',
- 'onHide',
- 'onUnload'
- ];
- hooks$2.push(...PAGE_EVENT_HOOKS);
- function parseBasePage (vuePageOptions, {
- isPage,
- initRelation
- }) {
- const pageOptions = parseComponent$1(vuePageOptions);
- initHooks(pageOptions.methods, hooks$2, vuePageOptions);
- pageOptions.methods.onLoad = function (args) {
- this.$vm.$mp.query = args; // 兼容 mpvue
- this.$vm.__call_hook('onLoad', args);
- };
- return pageOptions
- }
- function parsePage (vuePageOptions) {
- return parseBasePage(vuePageOptions, {
- isPage,
- initRelation
- })
- }
- const hooks$3 = [
- 'onBackPress',
- 'onNavigationBarButtonTap',
- 'onNavigationBarSearchInputChanged',
- 'onNavigationBarSearchInputConfirmed',
- 'onNavigationBarSearchInputClicked',
- 'onNavigationBarSearchInputFocusChanged'
- ];
- function parsePage$1 (vuePageOptions) {
- const pageOptions = parsePage(vuePageOptions);
- initHooks(pageOptions.methods, hooks$3);
- return pageOptions
- }
- function createPage (vuePageOptions) {
- {
- return Component(parsePage$1(vuePageOptions))
- }
- }
- function createComponent (vueOptions) {
- {
- return Component(parseComponent$1(vueOptions))
- }
- }
- todos.forEach(todoApi => {
- protocols[todoApi] = false;
- });
- canIUses.forEach(canIUseApi => {
- const apiName = protocols[canIUseApi] && protocols[canIUseApi].name ? protocols[canIUseApi].name
- : canIUseApi;
- if (!wx.canIUse(apiName)) {
- protocols[canIUseApi] = false;
- }
- });
- let uni = {};
- if (typeof Proxy !== 'undefined' && "app-plus" !== 'app-plus') {
- uni = new Proxy({}, {
- get (target, name) {
- if (target[name]) {
- return target[name]
- }
- if (baseApi[name]) {
- return baseApi[name]
- }
- if (api[name]) {
- return promisify(name, api[name])
- }
- if (eventApi[name]) {
- return eventApi[name]
- }
- if (!hasOwn(wx, name) && !hasOwn(protocols, name)) {
- return
- }
- return promisify(name, wrapper(name, wx[name]))
- },
- set (target, name, value) {
- target[name] = value;
- return true
- }
- });
- } else {
- Object.keys(baseApi).forEach(name => {
- uni[name] = baseApi[name];
- });
- Object.keys(eventApi).forEach(name => {
- uni[name] = eventApi[name];
- });
- Object.keys(api).forEach(name => {
- uni[name] = promisify(name, api[name]);
- });
- Object.keys(wx).forEach(name => {
- if (hasOwn(wx, name) || hasOwn(protocols, name)) {
- uni[name] = promisify(name, wrapper(name, wx[name]));
- }
- });
- }
- {
- if (typeof global !== 'undefined') {
- global.uni = uni;
- global.UniEmitter = eventApi;
- }
- }
- wx.createApp = createApp;
- wx.createPage = createPage;
- wx.createComponent = createComponent;
- var uni$1 = uni;
- export default uni$1;
- export { createApp, createComponent, createPage };
|