useRemote
Reactive remote data binding powered by Legend-State's sync engine.
Creates an Observable<T> that fetches from and optionally pushes to a remote source. No local persistence — data lives only in memory. Returns decomposed state including loading and error observables.
useRemote
Loading...
Fetches data from a remote source. No local persistence.
Value
0
Read-only
Section titled “Read-only”import { import useRemote
useRemote } from "@usels/web";
interface interface User
User { User.id: number
id: number; User.name: string
name: string;}
function function Component(): JSX.Element
Component() { const { const data$: any
data$, const isLoaded$: any
isLoaded$, const error$: any
error$ } = import useRemote
useRemote<interface User
User | null>({ get: () => any
get: () => any
fetch("/api/user").any
then((r: any
r) => r: any
r.any
json()), initial: null
initial: null, });
return ( <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> {const error$: any
error$.any
get() ? ( <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div>Error: {const error$: any
error$.any
get()?.any
message}</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> ) : const isLoaded$: any
isLoaded$.any
get() ? ( <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div>{const data$: any
data$.any
get()?.any
name}</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> ) : ( <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div>Loading...</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> )} </JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> );}import { createRemote, observable } from "@usels/web";
interface User { id: number; name: string;}
function Component() { "use scope" const { data$, isLoaded$, error$ } = createRemote<User | null>({ get: () => fetch("/api/user").then((r) => r.json()), initial: null, });
return ( <div> {error$.get() ? ( <div>Error: {error$.get()?.message}</div> ) : isLoaded$.get() ? ( <div>{data$.get()?.name}</div> ) : ( <div>Loading...</div> )} </div> );}Read & write
Section titled “Read & write”import { useRemote } from "@usels/web";
function Component() { const { data$, refetch } = useRemote<{ count: number }>({ get: () => fetch("/api/counter").then((r) => r.json()), set: ({ value }) => fetch("/api/counter", { method: "PUT", body: JSON.stringify(value), }), initial: { count: 0 }, debounceSet: 500, });
return ( <div> <span>{data$.count.get()}</span> <button onClick={() => data$.count.set((c) => c + 1)}>+1</button> <button onClick={refetch}>Refresh</button> </div> );}import { createRemote, observable } from "@usels/web";
function Component() { "use scope" const { data$, refetch } = createRemote<{ count: number }>({ get: () => fetch("/api/counter").then((r) => r.json()), set: ({ value }) => fetch("/api/counter", { method: "PUT", body: JSON.stringify(value), }), initial: { count: 0 }, debounceSet: 500, });
return ( <div> <span>{data$.count.get()}</span> <button onClick={() => data$.count.set((c) => c + 1)}>+1</button> <button onClick={refetch}>Refresh</button> </div> );}Parameters
Section titled “Parameters”| Parameter | Type | Description |
|---|---|---|
options | RemoteOptions<T> | - Remote sync configuration. |
RemoteOptions
Section titled “RemoteOptions”Returns
Section titled “Returns”RemoteReturn<T>
| Name | Type | Description |
|---|---|---|
data$ | Observable<T> | The synced observable data. |
isLoaded$ | ReadonlyObservable<boolean> | Whether the initial remote fetch has completed. |
isFetching$ | ReadonlyObservable<boolean> | Whether a fetch (initial or refetch) is currently in progress. |
error$ | ReadonlyObservable<Error | undefined> | The most recent sync error, if any. |
refetch | () => void | Trigger a manual re-fetch from remote. |