Svelte provides reactive versions of various built-ins like Map, Set and URL that can be used just like their native counterparts, as well as a handful of additional utilities for handling reactivity.
Creates a media query and provides a current property that reflects whether or not it matches.
Use it carefully — during server-side rendering, there is no way to know what the correct value should be, potentially causing content to change upon hydration.
If you can use the media query in CSS to achieve the same effect, do that.
A reactive version of the built-in Date object.
Reading the date (whether with methods like date.getTime() or date.toString(), or via things like Intl.DateTimeFormat)
in an effect or derived
will cause it to be re-evaluated when the value of the date changes.
<script>import{SvelteDate}from'svelte/reactivity';constdate=newSvelteDate();constformatter=newIntl.DateTimeFormat(undefined,{hour:'numeric',minute:'numeric',second:'numeric'});$effect(()=>{constinterval=setInterval(()=>{date.setTime(Date.now());},1000);return()=>{clearInterval(interval);};});</script><p>The time is {formatter.format(date)}</p>
A reactive version of the built-in Map object.
Reading contents of the map (by iterating, or by reading map.size or calling map.get(...) or map.has(...) as in the tic-tac-toe example below) in an effect or derived
will cause it to be re-evaluated as necessary when the map is updated.
Note that values in a reactive map are not made deeply reactive.
<script>import{SvelteMap}from'svelte/reactivity';import{result}from'./game.js';letboard=newSvelteMap();letplayer=$state('x');letwinner=$derived(result(board));functionreset(){player='x';board.clear();}</script><divclass="board">{#eachArray(9),i}<buttondisabled={board.has(i)||winner}onclick={()=>{board.set(i,player);player=player==='x'?'o':'x';}}>{board.get(i)}</button>{/each}</div>{#ifwinner}<p>{winner} wins!</p><buttononclick={reset}>reset</button>{:else}<p>{player} is next</p>{/if}
A reactive version of the built-in Set object.
Reading contents of the set (by iterating, or by reading set.size or calling set.has(...) as in the example below) in an effect or derived
will cause it to be re-evaluated as necessary when the set is updated.
Note that values in a reactive set are not made deeply reactive.
<script>import{SvelteSet}from'svelte/reactivity';letmonkeys=newSvelteSet();functiontoggle(monkey){if(monkeys.has(monkey)){monkeys.delete(monkey);}else{monkeys.add(monkey);}}</script>{#each['🙈', '🙉', '🙊'] as monkey}<buttononclick={()=>toggle(monkey)}>{monkey}</button>{/each}<buttononclick={()=>monkeys.clear()}>clear</button>{#ifmonkeys.has('🙈')}<p>see no evil</p>{/if}{#ifmonkeys.has('🙉')}<p>hear no evil</p>{/if}{#ifmonkeys.has('🙊')}<p>speak no evil</p>{/if}
A reactive version of the built-in URL object.
Reading properties of the URL (such as url.href or url.pathname) in an effect or derived
will cause it to be re-evaluated as necessary when the URL changes.
<script>import{SvelteURL}from'svelte/reactivity';consturl=newSvelteURL('https://example.com/path');</script><!-- changes to these... --><inputbind:value={url.protocol}/><inputbind:value={url.hostname}/><inputbind:value={url.pathname}/><hr/><!-- will update `href` and vice versa --><inputbind:value={url.href}size="65"/>
A reactive version of the built-in URLSearchParams object.
Reading its contents (by iterating, or by calling params.get(...) or params.getAll(...) as in the example below) in an effect or derived
will cause it to be re-evaluated as necessary when the params are updated.
Returns a subscribe function that integrates external event-based systems with Svelte's reactivity.
It's particularly useful for integrating with web APIs like MediaQuery, IntersectionObserver, or WebSocket.
If subscribe is called inside an effect (including indirectly, for example inside a getter),
the start callback will be called with an update function. Whenever update is called, the effect re-runs.
If start returns a cleanup function, it will be called when the effect is destroyed.
If subscribe is called in multiple effects, start will only be called once as long as the effects
are active, and the returned teardown function will only be called when all effects are destroyed.
It's best understood with an example. Here's an implementation of MediaQuery:
import{createSubscriber}from'svelte/reactivity';import{on}from'svelte/events';exportclassMediaQuery{#query;#subscribe;constructor(query){this.#query=window.matchMedia(`(${query})`);this.#subscribe=createSubscriber((update)=>{// when the `change` event occurs, re-run any effects that read `this.current`constoff=on(this.#query,'change',update);// stop listening when all the effects are destroyedreturn()=>off();});}getcurrent(){// This makes the getter reactive, if read in an effectthis.#subscribe();// Return the current state of the query, whether or not we're in an effectreturnthis.#query.matches;}}
Creates a media query and provides a current property that reflects whether or not it matches.
Use it carefully — during server-side rendering, there is no way to know what the correct value should be, potentially causing content to change upon hydration.
If you can use the media query in CSS to achieve the same effect, do that.
A reactive version of the built-in Date object.
Reading the date (whether with methods like date.getTime() or date.toString(), or via things like Intl.DateTimeFormat)
in an effect or derived
will cause it to be re-evaluated when the value of the date changes.
<script>import{SvelteDate}from'svelte/reactivity';constdate=newSvelteDate();constformatter=newIntl.DateTimeFormat(undefined,{hour:'numeric',minute:'numeric',second:'numeric'});$effect(()=>{constinterval=setInterval(()=>{date.setTime(Date.now());},1000);return()=>{clearInterval(interval);};});</script><p>The time is {formatter.format(date)}</p>
classSvelteDateextendsDate{/*…*/}
constructor(...params:any[]);
SvelteMap
A reactive version of the built-in Map object.
Reading contents of the map (by iterating, or by reading map.size or calling map.get(...) or map.has(...) as in the tic-tac-toe example below) in an effect or derived
will cause it to be re-evaluated as necessary when the map is updated.
Note that values in a reactive map are not made deeply reactive.
<script>import{SvelteMap}from'svelte/reactivity';import{result}from'./game.js';letboard=newSvelteMap();letplayer=$state('x');letwinner=$derived(result(board));functionreset(){player='x';board.clear();}</script><divclass="board">{#eachArray(9),i}<buttondisabled={board.has(i)||winner}onclick={()=>{board.set(i,player);player=player==='x'?'o':'x';}}>{board.get(i)}</button>{/each}</div>{#ifwinner}<p>{winner} wins!</p><buttononclick={reset}>reset</button>{:else}<p>{player} is next</p>{/if}
A reactive version of the built-in Set object.
Reading contents of the set (by iterating, or by reading set.size or calling set.has(...) as in the example below) in an effect or derived
will cause it to be re-evaluated as necessary when the set is updated.
Note that values in a reactive set are not made deeply reactive.
<script>import{SvelteSet}from'svelte/reactivity';letmonkeys=newSvelteSet();functiontoggle(monkey){if(monkeys.has(monkey)){monkeys.delete(monkey);}else{monkeys.add(monkey);}}</script>{#each['🙈', '🙉', '🙊'] as monkey}<buttononclick={()=>toggle(monkey)}>{monkey}</button>{/each}<buttononclick={()=>monkeys.clear()}>clear</button>{#ifmonkeys.has('🙈')}<p>see no evil</p>{/if}{#ifmonkeys.has('🙉')}<p>hear no evil</p>{/if}{#ifmonkeys.has('🙊')}<p>speak no evil</p>{/if}
classSvelteSet<T>extendsSet<T>{/*…*/}
constructor(value?:Iterable<T>|null|undefined);
add(value:T):this;
SvelteURL
A reactive version of the built-in URL object.
Reading properties of the URL (such as url.href or url.pathname) in an effect or derived
will cause it to be re-evaluated as necessary when the URL changes.
<script>import{SvelteURL}from'svelte/reactivity';consturl=newSvelteURL('https://example.com/path');</script><!-- changes to these... --><inputbind:value={url.protocol}/><inputbind:value={url.hostname}/><inputbind:value={url.pathname}/><hr/><!-- will update `href` and vice versa --><inputbind:value={url.href}size="65"/>
classSvelteURLextendsURL{/*…*/}
getsearchParams():SvelteURLSearchParams;
SvelteURLSearchParams
A reactive version of the built-in URLSearchParams object.
Reading its contents (by iterating, or by calling params.get(...) or params.getAll(...) as in the example below) in an effect or derived
will cause it to be re-evaluated as necessary when the params are updated.
Returns a subscribe function that integrates external event-based systems with Svelte’s reactivity.
It’s particularly useful for integrating with web APIs like MediaQuery, IntersectionObserver, or WebSocket.
If subscribe is called inside an effect (including indirectly, for example inside a getter),
the start callback will be called with an update function. Whenever update is called, the effect re-runs.
If start returns a cleanup function, it will be called when the effect is destroyed.
If subscribe is called in multiple effects, start will only be called once as long as the effects
are active, and the returned teardown function will only be called when all effects are destroyed.
It’s best understood with an example. Here’s an implementation of MediaQuery:
Returns a subscribe function that integrates external event-based systems with Svelte's reactivity.
It's particularly useful for integrating with web APIs like MediaQuery, IntersectionObserver, or WebSocket.
If subscribe is called inside an effect (including indirectly, for example inside a getter),
the start callback will be called with an update function. Whenever update is called, the effect re-runs.
If start returns a cleanup function, it will be called when the effect is destroyed.
If subscribe is called in multiple effects, start will only be called once as long as the effects
are active, and the returned teardown function will only be called when all effects are destroyed.
It's best understood with an example. Here's an implementation of MediaQuery:
import{createSubscriber}from'svelte/reactivity';import{on}from'svelte/events';exportclassMediaQuery{#query;#subscribe;constructor(query){this.#query=window.matchMedia(`(${query})`);this.#subscribe=createSubscriber((update)=>{// when the `change` event occurs, re-run any effects that read `this.current`constoff=on(this.#query,'change',update);// stop listening when all the effects are destroyedreturn()=>off();});}getcurrent(){// This makes the getter reactive, if read in an effectthis.#subscribe();// Return the current state of the query, whether or not we're in an effectreturnthis.#query.matches;}}
Attaches an event handler to the window and returns a function that removes the handler. Using this
rather than addEventListener will preserve the correct order relative to handlers added declaratively
(with attributes like onclick), which use event delegation for performance reasons
The Window interface's matchMedia() method returns a new MediaQueryList object that can then be used to determine if the document matches the media query string, as well as to monitor the document to detect when it matches (or stops matching) that media query.
Returns a subscribe function that integrates external event-based systems with Svelte's reactivity.
It's particularly useful for integrating with web APIs like MediaQuery, IntersectionObserver, or WebSocket.
If subscribe is called inside an effect (including indirectly, for example inside a getter),
the start callback will be called with an update function. Whenever update is called, the effect re-runs.
If start returns a cleanup function, it will be called when the effect is destroyed.
If subscribe is called in multiple effects, start will only be called once as long as the effects
are active, and the returned teardown function will only be called when all effects are destroyed.
It's best understood with an example. Here's an implementation of MediaQuery:
import{createSubscriber}from'svelte/reactivity';import{on}from'svelte/events';exportclassMediaQuery{#query;#subscribe;constructor(query){this.#query=window.matchMedia(`(${query})`);this.#subscribe=createSubscriber((update)=>{// when the `change` event occurs, re-run any effects that read `this.current`constoff=on(this.#query,'change',update);// stop listening when all the effects are destroyedreturn()=>off();});}getcurrent(){// This makes the getter reactive, if read in an effectthis.#subscribe();// Return the current state of the query, whether or not we're in an effectreturnthis.#query.matches;}}
5.7.0
reference((update(parameter)update:()=>void)=>{ // when the `change` event occurs, re-run any effects that read `this.current`constoffconstoff:()=>void=on(alias)on<MediaQueryList,"change">(element:MediaQueryList,type:"change",handler:(this:MediaQueryList,event:MediaQueryListEvent&{currentTarget:MediaQueryList;})=>any,options?:AddEventListenerOptions|undefined):()=>void(+4overloads)importon
Attaches an event handler to an element and returns a function that removes the handler. Using this
rather than addEventListener will preserve the correct order relative to handlers added declaratively
(with attributes like onclick), which use event delegation for performance reasons
reference(this.#query,'change',update(parameter)update:()=>void); // stop listening when all the effects are destroyedreturn()=>offconstoff:()=>void();});}getcurrent(getter)MediaQuery.current:boolean(){ // This makes the getter reactive, if read in an effectthis.#subscribe(); // Return the current state of the query, whether or not we're in an effectreturnthis.#query.matches(property)MediaQueryList.matches:boolean
The matches read-only property of the MediaQueryList interface is a boolean value that returns true if the document currently matches the media query list, or false if not.