RubyLouvre/anu

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

Summary

Maintainability
A
3 hrs
Test Coverage
import { Renderer } from "react-core/createRenderer";
import { topNodes, noop, get, topFibers } from "react-core/util";
import {
    delayMounts,
    usingComponents,
    _getApp,
    updateMiniApp,
    callGlobalHook
} from "./utils";
import { render } from "react-fiber/scheduleWork";
import { createElement } from "react-core/createElement";
import { _getGlobalApp } from "./registerApp.all";

export function onLoad(PageClass, path, query, fire) {
    var app = _getApp();
    // 快应用拿不到全局数据,从globalData中取
    let GlobalApp = _getGlobalApp(app);
    app.$$pageIsReady = false; //pageIsReadyg与delayMounts是专门给快应用
    app.$$page = this;
    app.$$pagePath = path;
    var dom = PageClass.container;
    var pageInstance;
    if (typeof GlobalApp === "function") {
        this.needReRender = true;
        render(
            createElement(
                GlobalApp,
                {},
                createElement(PageClass, {
                    path: path,
                    key: path,
                    query: query,
                    isPageComponent: true
                })
            ),
            dom,
            function() {
                var fiber = get(this).child;
                while (!fiber.stateNode.classUid) {
                    fiber = fiber.child;
                }
                pageInstance = fiber.stateNode;
            }
        );
    } else {
        pageInstance = render(
            //生成页面的React对象
            createElement(PageClass, {
                path: path,
                query: query,
                isPageComponent: true
            }),
            dom
        );
    }
    this.reactContainer = dom;
    this.reactInstance = pageInstance;
    pageInstance.wx = this; //保存小程序的页面对象
    if (fire) {
        callGlobalHook("onGlobalLoad"); //调用全局onLoad方法
        updateMiniApp(pageInstance); //更新小程序视图
    }
    return pageInstance;
}

export function onReady() {
    var app = _getApp();
    app.$$pageIsReady = true;
    let el = void 0;
    while ((el = delayMounts.pop())) {
        el.fn.call(el.instance);
        el.instance.componentDidMount = el.fn;
    }
    callGlobalHook("onGlobalReady");
}

export function onUnload() {
    for (let i in usingComponents) {
        let a = usingComponents[i];
        if (a.reactInstances) {
            a.reactInstances.length = 0;
        }
        delete usingComponents[i];
    }
    let root = this.reactContainer;
    let container = root && root._reactInternalFiber;
    if (container) {
        Renderer.updateComponent(
            container.child,
            {
                child: null
            },
            function() {
                root._reactInternalFiber = null;
                let j = topNodes.indexOf(root);
                if (j !== -1) {
                    topFibers.splice(j, 1);
                    topNodes.splice(j, 1);
                }
            },
            true
        );
    }
    callGlobalHook("onGlobalUnload");
    this.reactContainer = null;
}