markComponent(fn) flags fn as a component — when the renderer sees
a marked function as a child it invokes it untracked (signals read
inside don't re-run the parent), which is the right semantic for
components vs. reactive expressions. Hand-roll this when you build a
component factory that bypasses JSX.
The flag can be read back with isComponent.
| name | type | description |
|---|---|---|
fn |
(...args) => T |
the function to mark |
Returns: the same fn, now tagged as a component.
The same function body twice as a child: the plain one is a reactive
expression that rebuilds its paragraph on every count change, the
marked one runs once, untracked.
import { markComponent, render, signal } from 'pota'
function App() {
const count = signal(0)
const tracked = () => <p>rebuilt at count = {count.read()}</p>
const marked = markComponent(() => (
<p>created once at count = {count.read()}</p>
))
return (
<div>
<button on:click={() => count.update(n => n + 1)}>+1</button>
{tracked}
{marked}
</div>
)
}
render(App)