diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 96e0986..d064fe4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -376,6 +376,7 @@ export class QuarkElement extends HTMLElement implements ReactiveControllerHost * 初始值重写后首次渲染 */ this._render(); + this._controllers?.forEach((c) => c.hostMounted?.()); if (isFunction(this.componentDidMount)) { this.componentDidMount(); } diff --git a/packages/core/src/reactiveController.ts b/packages/core/src/reactiveController.ts index 4e4add7..75c46e9 100644 --- a/packages/core/src/reactiveController.ts +++ b/packages/core/src/reactiveController.ts @@ -60,4 +60,9 @@ export interface ReactiveController { * */ hostUpdated?(): void; + + /** + * Called when the host is mounted, just after the host calls first render. + */ + hostMounted?():void; } diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 0759b77..f010849 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -52,8 +52,6 @@ export class Router extends Routes { override hostConnected() { super.hostConnected(); - eventBus.emit("router-host-mounted", this); - eventBus.on("link-mounted", this._busRouterLinstner); window.addEventListener('popstate', this._onPopState); // Kick off routed rendering by going to the current URL this.goto(this._resolvePath(window.location)); @@ -67,6 +65,12 @@ export class Router extends Routes { this.host.removeEventListener(RouterJumpMethodEnum.replace, this._rootHostListener!); } + override hostMounted() { + super.hostMounted(); + eventBus.emit("router-host-mounted", this); + eventBus.on("link-mounted", this._busRouterLinstner); + } + protected override addListeners() { super.addListeners(); this._rootHostListener = (e: CustomEvent) => { diff --git a/packages/router/src/routes.ts b/packages/router/src/routes.ts index c2ce82f..c0848e6 100644 --- a/packages/router/src/routes.ts +++ b/packages/router/src/routes.ts @@ -310,8 +310,6 @@ export class Routes implements ReactiveController { const event = new RoutesConnectedEvent(this); this._host.dispatchEvent(event); this._onDisconnect = event.onDisconnect; - eventBus.emit("routes-host-mounted", this); - eventBus.on("link-mounted", this._busRoutesListener); } hostDisconnected() { @@ -325,6 +323,11 @@ export class Routes implements ReactiveController { this._host.removeEventListener(RouteMethodEnum.replace, this._hostListener!); } + hostMounted() { + eventBus.emit("routes-host-mounted", this); + eventBus.on("link-mounted", this._busRoutesListener); + } + private _onRoutesConnected = (e: RoutesConnectedEvent) => { // Don't handle the event fired by this routes controller, which we get // because we do this.dispatchEvent(...)