@gluonjs/core / src / TemplateResult
Class: TemplateResult
Constructors
Constructor
new TemplateResult(
strings,values,type?,styleDependencies?):TemplateResult
Parameters
strings
TemplateStringsArray
values
readonly TemplateValue[]
type?
TemplateType = 'html'
styleDependencies?
readonly ComponentStyleDependency[] = emptyComponentStyles
Returns
TemplateResult
Properties
strings
readonlystrings:TemplateStringsArray
styleDependencies
readonlystyleDependencies: readonlyComponentStyleDependency[] =emptyComponentStyles
type
readonlytype:TemplateType='html'
values
readonlyvalues: readonlyTemplateValue[]
Methods
withStyleDependencies()
withStyleDependencies(
dependencies):TemplateResult
Returns the same template value with immutable component-style metadata.
Parameters
dependencies
readonly ComponentStyleDependency[]
Returns
TemplateResult
Example
Keep the compiled template strings, dynamic values, and HTML/SVG type together as the immutable unit consumed by rendering and hydration:
import {
TemplateResult,
directive,
elementRef,
event,
html,
hydrate,
render,
repeat,
suspendRender,
svg,
unsafeHTML,
unsafeURL,
type DirectiveValue,
type EventBinding,
type RefTarget,
type RepeatResult,
type UnsafeHtmlResult,
type UnsafeUrlResult,
} from '@gluonjs/core';
import { prepareForHydration } from '@gluonjs/ssr';
const products = [{ id: 'lamp', name: 'Orbit Lamp' }, { id: 'tray', name: 'Stack Tray' }];
const rows: RepeatResult = repeat(products, (product) => product.id, (product) => html`<li>${product.name}</li>`);
const click: EventBinding = event(() => console.log('saved'), { once: true });
const buttonRef: RefTarget<HTMLButtonElement> = elementRef<HTMLButtonElement>();
const trustedDescription: UnsafeHtmlResult = unsafeHTML('<strong>In stock</strong>');
const trustedManual: UnsafeUrlResult = unsafeURL('https://example.com/manual.pdf');
const text = directive<readonly [string]>((value) => (part) => part.setValue(value));
const status: DirectiveValue = text('Ready');
const icon = svg`<svg viewBox='0 0 10 10'><circle cx='5' cy='5' r='4'></circle></svg>`;
const template: TemplateResult = html`
<section>${icon}<ul>${rows}</ul>${trustedDescription}
<a href=${trustedManual}>Manual</a>
<button ...=${{ ref: buttonRef }} @click=${click}>${status}</button>
</section>
`;
const clientRoot = document.createElement('div');
render(template, clientRoot);
suspendRender(clientRoot);
render(template, clientRoot);
const prepared = await prepareForHydration(template);
if (!(prepared.value instanceof TemplateResult)) throw new Error('Expected one template root');
const hydrationRoot = document.createElement('div');
hydrationRoot.innerHTML = prepared.html;
const hydration = hydrate(prepared.value, hydrationRoot, { expectedMarkup: prepared.html });
console.log(hydration.retained, rows.items.length, buttonRef.value, trustedDescription.markup, trustedManual.value);