RubyLouvre/anu

View on GitHub
packages/render/miniapp/registerPage.quick.js

Summary

Maintainability
B
6 hrs
Test Coverage
import { emptyObject,noop } from 'react-core/util'
import { dispatchEvent } from './eventSystem.quick'
import { onLoad, onUnload, onReady } from './registerPage.all'
import {  _getApp } from './utils'
import { getQueryFromUri } from './apiForQuick/router'
import { getCurrentPages } from './getCurrentPages.quick'
import { registerPageHook } from './registerPageHook';

var appHooks = {
    onShow: 'onGlobalShow',
    onHide: 'onGlobalHide'
}


function getQuery(wx, huaweiHack) {
    var page = wx.$page;
    if (page.query) { //小米快应用新规范,this.$page.query 返回页面启动时的参数数据;
        return page.query;
    }
    var query = {};
    //小米快应用直接从page.uri中抽取参数
    if (page.uri) {
        getQueryFromUri(page.uri, query)
        for (let i in query) {
            return query;
        }
    }
    //否则返回navigateTo/redirectTo/navigateBack中储存起来的参数
    var data = _getApp().globalData;
    var routerQuery = data && data.__quickQuery && data.__quickQuery[page.path] || query;
     //华为快应用从protected、public中抽取
    if ( huaweiHack && Object.keys(huaweiHack).length) { 
        for (let i in huaweiHack) {
           routerQuery[i] = wx[i];
        }
    }
    return routerQuery;
}

export function registerPage(PageClass, path) {
    PageClass.reactInstances = []
    PageClass.container = {
        type: "page",
        props: {},
        children: [],
        root: true,
        appendChild: noop
    };
    var def = _getApp().$def
    var appInner = def.innerQuery;
    var appOuter = def.outerQuery;
    var pageInner = PageClass.innerQuery;
    var pageOuter = PageClass.outerQuery;

    if( !pageInner && PageClass.protected){
        console.warn( 'protected静态对象已经被废弃,请改用pageQuery静态对象' )
        pageInner = PageClass.protected
    }
    var innerQuery = pageInner ?  Object.assign({}, appInner, pageInner ): appInner;
    var outerQuery = pageOuter ?  Object.assign({}, appOuter, pageOuter ): appOuter;
    var duplicate = {}
    if(innerQuery){
        for(var i in innerQuery){
            duplicate[i] = true
        }
    }
    
    if(outerQuery){
        var keys = [];
        for(var i in outerQuery){
            if(duplicate[i] === true){
                keys.push(i);
            }
            duplicate[i] = true;
        }
        if(keys.length){
            throw '页面 '+ path+ ' 的两个参数对象存在重复的键名 '+ keys;
        }
    }

    let config = {
        private: {
            props: Object,
            context: Object,
            state: Object
        },
        //华为快应用拿不到页面参数,在$page.uri拿不到,manifest.json加了filter也不行
        protected: innerQuery,
        public: outerQuery,
        dispatchEvent,
        onInit() {
            let app = this.$app;
            let instance = onLoad.call(this, PageClass, path, getQuery(this, duplicate), true);
            let pageConfig = PageClass.config || instance.config || emptyObject;
            app.$$pageConfig = Object.keys(pageConfig).length ?
                pageConfig :
                null;
        },
        onReady: onReady,
        onDestroy: onUnload
    }
    Array('onShow', 'onHide', 'onMenuPress', "onBackPress").forEach(function(pageHook) {
        config[pageHook] = function(e) {
            let instance = this.reactInstance,
                app = _getApp(),
                query = e
            if (pageHook === 'onShow') {
                query = instance.props.query = getQuery(this, duplicate);
                app.$$page = instance.wx;
                var path = app.$$pagePath = instance.props.path;
                if(this.needReRender){
                    onLoad.call(this, PageClass, path, query);
                }
            } else if (pageHook === 'onMenuPress') {
                app.onShowMenu && app.onShowMenu(instance, this.$app);
                return
            } else if (pageHook == 'onBackPress') {
                if (instance[pageHook] && instance[pageHook]() === true) {
                    return
                }
                getCurrentPages().pop();
            }
            return registerPageHook(appHooks,  pageHook,  app, instance, query);
        }
    })
    return config
}