Skip to content
Sync

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
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 { 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>
);
}
ParameterTypeDescription
optionsRemoteOptions<T>- Remote sync configuration.
OptionTypeDefaultDescription
get() => T | Promise<T>-Function that fetches remote data.
set((params: { value: T; changes: object[]; }) => void | Promise<void>)-Function that sends changes to the remote.
initialT-Initial value before the first fetch completes.
mode"set" | "assign" | "merge" | "append" | "prepend""set"How incoming data merges with existing state.
debounceSetnumber-Milliseconds to debounce before sending changes to remote.
transform{ load?: ((value: any) => T) | undefined; save?: ((value: T) => any) | undefined; }-Transform data on load/save.

RemoteReturn<T>

NameTypeDescription
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() => voidTrigger a manual re-fetch from remote.

View on GitHub