PIPEABLE STORE
Use an rxWritable just like a Svelte writable, but with the option to pipe RxJS operators
and compose streams. It has all the benefits of simple Svelte store syntax + robust RxJS utility.
const mousemove = rxWritable(null);
const mouseXYDiff = mousemove.pipe(
filter(evt => !!evt),
debounceTime(200),
map(evt => {
return {x: evt.clientX, y: evt.clientY}
}),
tap(position => console.log("rxWritable:", position)),
map(position => position.x - position.y)
)
<div on:mousemove={event => $mousemove = event}>
(mousemove over)
<span>mouseXYDiff: {JSON.stringify($mouseXYDiff)}</span>
</div>
ACTIONS
Emits the most recent event via rxEmit(event => event.detail) after events have stopped
for x number of milliseconds, as specified by the duration option (default is 250ms). Useful when
you only want to handle an event after activity has stopped.
Debounced Text:
Non-Debounced Text:
<input
use:rxDebounce
on:rxEmit={handleInputChange}
/>
Makes a GET request using the input value whenever it changes. The rxGETStatus event will emit with event detail whenever the status changes. Pending requests are automatically cancelled when a new request is made. Use options to adjust the debounce time, query parameters, or a formatting function if you want to customize how the input value is used.
Events:
on:rxGETStatus Event Detail Schema:
status:'EMPTY''DEBOUNCING''PENDING''SUCCESS''ERROR'value: string;the current input valueresponse: anycontains the response object when status is SUCCESS or ERROR, otherwisenull
Request Status:
IDLEResults: (0)
import { rxGETFromInput, rxGETStatusDetails } from 'svelte-fuse-rx';
let reqStatus = 'IDLE';
let repos = [];
const handleRequest = (eventDetail: rxGETStatusDetails) => {
const { status, response } = eventDetail;
reqStatus = status;
if (status === 'SUCCESS') {
repos = response.items;
} else {
repos = [];
}
};
// ...
<input
use:rxGETFromInput={{
baseURL,
queryParamKey: 'q',
queryParams: 'per_page=5'
}}
on:rxGETStatus={(e) => handleRequest(e.detail)}
/>
use:rxThrottle
Emits an event (if one occurs) via rxEmit(event => event.detail) every x number of milliseconds,
as specified by the throttle duration option (default is 250ms). Useful when you only want to handle
an event every x number of milliseconds.
(mousemove over and watch console)
<div
use:rxThrottle={{
on: 'mousemove',
duration: 1000
}}
on:rxEmit={handleMousemoveCoords}
>
use:rxBufferTime
Emits an array of events via rxEmit(event => event.detail) that have accumulated over
the specified number of milliseconds (default is 250ms). If no event has occurred, it will not emit
empty arrays.
(mousemove over and watch console)
<div
use:rxBufferTime={{
on: 'mousemove',
duration: 250
}}
on:rxEmit={handleMousemoveBuffer}
>
use:rxBufferCount
Emits an array of events via rxEmit(event => event.detail) when the specified count
is reached (default is 25).
(mousemove over and watch console)
<div
use:rxBufferCount={{
on: 'mousemove',
count: 25
}}
on:rxEmit={handleMousemoveBuffer}
>