Skip to content
Ilha
Esc
navigateopen⌘Jpreview
On this page

Without JSX

Build views with h() when you cannot use JSX.

Prefer JSX. When a file cannot use the JSX runtime, call h():

import { const atom: AtomFnatom, function h(type: string | Fragment | ((props: Record<string, unknown>) => unknown), props: Record<string, unknown> | null | undefined, ...rest: View[]): VNodeh } from "ilha";

const const Counter: () => VNodeCounter = () => {
  const const count: AtomHandle<number>count = atom<number>(init: number | Atom<number> | Effect<number, any, any> | Stream<number, any, any>): AtomHandle<number>atom(0);
  return function h(type: string | Fragment | ((props: Record<string, unknown>) => unknown), props: Record<string, unknown> | null | undefined, ...rest: View[]): VNodeh(
    "button",
    {
      type: stringtype: "button",
      onclick: () => voidonclick: () => const count: AtomHandle<number>count.AtomHandle<number>.update(f: (current: number) => number): voidupdate((n: numbern: number) => n: numbern + 1),
    },
    "count: ",
    const count: AtomHandle<number>count,
  );
};

h(type, props, ...children) is the same factory JSX uses. There is no html tagged template in this API.

Tagged templates

If you want markup that looks like the old html tagged-template helper, look at @knighted/jsx. It is a tagged-template JSX runtime. It is not built into Ilha.

It is compatible with Ilha only if the tag emits h() vnodes ($$ilha: 1), not DOM nodes or React.createElement. The package defaults to React; override its createElement / fragment to h and Fragment from ilha if that option exists in the version you install.

Use lowercase event props (onclick, not onClick). Ilha only binds all-lowercase on* keys. class and className both work.

Prefer real JSX or h() for anything you ship. Treat @knighted/jsx as an optional authoring layer, not part of the Ilha contract.

Was this page helpful?