@gluonjs/core / src / AppRootRenderContext
Interface: AppRootRenderContext<Public>
Type Parameters
Public
Public
Properties
app
readonlyapp:GluonApp<Public>
Methods
component()
component<
Props>(name,props):TemplateValue
Type Parameters
Props
Props
Parameters
name
string
props
Readonly<Props>
Returns
expose()
expose(
value):void
Parameters
value
Public
Returns
void
inject()
Call Signature
inject<
Value>(key):Value
Type Parameters
Value
Value
Parameters
key
InjectionKey<Value>
Returns
Value
Call Signature
inject<
Value>(key,fallback):Value
Type Parameters
Value
Value
Parameters
key
InjectionKey<Value>
fallback
Value
Returns
Value
Example
Use the root render context to inject dependencies, expose a public API, and render registered components within one app:
import {
createApp,
createInjectionKey,
dynamicComponent,
html,
inject,
refreshGluonApplications,
runWithErrorHandling,
unmount,
warn,
type AppConfig,
type AppContainer,
type AppErrorHandler,
type AppErrorInfo,
type AppErrorSource,
type AppMount,
type AppPluginCleanup,
type AppRoot,
type AppRootRenderContext,
type AppWarningHandler,
type AppWarningInfo,
type FunctionalComponent,
type GluonApp,
type GluonAppPlugin,
type GluonPlugin,
type GluonPluginFunction,
type InjectionKey,
} from '@gluonjs/core';
type PublicApi = { refresh(): void };
const localeKey: InjectionKey<string> = createInjectionKey<string>('locale');
const ShopView: FunctionalComponent<{ locale: string }> = ({ locale }) => html`<main lang=${locale}>Shop</main>`;
const root: AppRoot<PublicApi> = (context: AppRootRenderContext<PublicApi>) => {
const locale = inject(localeKey, context.inject(localeKey, 'en'));
context.expose({ refresh: () => console.log('refresh') });
return html`${dynamicComponent('ShopView', { locale })}`;
};
const errorHandler: AppErrorHandler = (info: AppErrorInfo) => console.error(info.source, info.error);
const warningHandler: AppWarningHandler = (info: AppWarningInfo) => console.warn(info.code, info.message);
const source: AppErrorSource = 'application';
const cleanup: AppPluginCleanup = () => console.log('logger disposed');
const logger: GluonPluginFunction<{ prefix: string }> = (app, options) => {
app.config.errorHandler = (info) => console.error(options.prefix, info.source, info.error);
app.config.warnHandler = warningHandler;
return cleanup;
};
const plugin: GluonPlugin = { install: (app) => { app.config.globalProperties.source = source; } };
const typedPlugin: GluonAppPlugin<{ prefix: string }> = logger;
const app: GluonApp<PublicApi> = createApp(root)
.provide(localeKey, 'de')
.component('ShopView', ShopView)
.use(plugin)
.use(typedPlugin, { prefix: '[shop]' });
const config: AppConfig = app.config;
config.errorHandler = errorHandler;
const container: AppContainer = document.querySelector('#app')!;
const mount: AppMount<PublicApi> = app.mount(container);
mount.exposed?.refresh();
app.run(() => runWithErrorHandling(() => warn('Inventory is stale', 'SHOP_STALE')));
refreshGluonApplications();
mount.unmount();
unmount(container);