Templates and Binding
Element uses tagged template literals for creating reactive DOM elements. The html()
function processes these templates and sets up automatic updates.
Basic Syntax
const [title, setTitle] = createSignal("Hello World!");
const template = html`
<div class="container">
<h1>${title}</h1>
<p>Lorem ipsum dolor sit amet...</p>
</div>
`;
Binding Types
Element supports different types of bindings:
1. Text Binding
const [text, setText] = createSignal("Lorem ipsum dolor sit amet...");
const template = html`<p>${text}</p>`;
2. Attribute Binding
const [className, setClassName] = createSignal("link-wrapper");
const [url, setUrl] = createSignal("https://github.com");
const template = html`
<div class="${className}">
<a href="${url}">Link</a>
</div>
`;
3. Property Binding
const [isChecked, setIsChecked] = createSignal(true);
const [inputValue, setInputValue] = createSignal(
"Lorem ipsum dolor sit amet..."
);
const template = html`
<div>
<input
type="checkbox"
checked="${isChecked}"
onchange="${(e) => console.log(e.target.checked)}"
/>
<input
type="text"
value="${inputValue}"
oninput="${(e) => console.log(e.target.value)}"
/>
</div>
`;
Supported DOM Properties
properties:
- checked
- defaultChecked
- defaultSelected
- defaultValue
- disabled
- hidden
- innerHTML
- innerText
- readOnly
- required
- selected
- textContent
- value
4. Event Binding
const [count, setCount] = createSignal(0);
const template = html`
<button type="button" onclick="${() => setCount(count() + 1)}">
Count: ${count}
</button>
`;
Supported DOM Events
events:
- onblur
- onchange
- onclick
- oncontextmenu
- ondblclick
- onfocus
- oninput
- onkeydown
- onkeypress
- onkeyup
- onmousedown
- onmousemove
- onmouseout
- onmouseover
- onmouseup
- onresize
- onscroll
- onsubmit
Built-in Components
Element provides built-in components for common patterns:
Conditional Rendering
import { If, IfOrElse } from "@dmnchzl/element";
const [loading, setLoading] = createSignal(true);
const [user, setUser] = createSignal<{ name: string } | null>(null);
// Simple conditional
const loadingTemplate = If(loading, (isLoading) => html`<div>Loading...</div>`);
// Complex conditional
const userTemplate = IfOrElse(
user,
(value) => html`<h2>Hi ${value.name}!</h2>`,
() => html`<h2>Welcome 👋</h2>`
);
List Rendering
import { For } from "@dmnchzl/element";
const [fruits, setFruits] = createSignal([
{ id: "A", name: "Apple" },
{ id: "B", name: "Banana" },
{ id: "C", name: "Cherry" },
]);
const listTemplate = For(
fruits,
(fruit, index) => html`<li>${index + 1}. ${fruit.name}</li>`
);
Last updated