INIT
This commit is contained in:
+14
@@ -0,0 +1,14 @@
|
||||
import type { Box } from "../types.js";
|
||||
type WatcherCallback<T> = (curr: T, prev: T) => void | Promise<void> | (() => void) | (() => Promise<void>);
|
||||
type WatchOptions = {
|
||||
/**
|
||||
* Whether to eagerly run the watcher before the state is updated.
|
||||
*/
|
||||
immediate?: boolean;
|
||||
/**
|
||||
* Whether to run the watcher only once.
|
||||
*/
|
||||
once?: boolean;
|
||||
};
|
||||
export declare function watch<T>(box: Box<T>, callback: WatcherCallback<T>, options?: WatchOptions): () => void;
|
||||
export {};
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
import { untrack } from "svelte";
|
||||
export function watch(box, callback, options = {}) {
|
||||
let prev = $state(box.current);
|
||||
let ranOnce = false;
|
||||
const watchEffect = $effect.root(() => {
|
||||
$effect.pre(() => {
|
||||
if (prev === box.current || !options.immediate)
|
||||
return;
|
||||
if (options.once && ranOnce)
|
||||
return;
|
||||
callback(box.current, untrack(() => prev));
|
||||
untrack(() => (prev = box.current));
|
||||
ranOnce = true;
|
||||
});
|
||||
$effect(() => {
|
||||
if (prev === box.current || options.immediate)
|
||||
return;
|
||||
if (options.once && ranOnce)
|
||||
return;
|
||||
callback(box.current, untrack(() => prev));
|
||||
untrack(() => (prev = box.current));
|
||||
ranOnce = true;
|
||||
});
|
||||
});
|
||||
return watchEffect;
|
||||
}
|
||||
Reference in New Issue
Block a user