Svelte 提供了各种内置函数的响应式版本,如[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)、[`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)和[`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL),它们可以像它们的原生版本一样使用,同时还提供了一些额外的处理响应式的实用工具。 ```js // @noErrors import { MediaQuery, SvelteDate, SvelteMap, SvelteSet, SvelteURL, SvelteURLSearchParams, createSubscriber } from 'svelte/reactivity'; ``` ## 媒体查询 > 自 5.7.0 版本起可用 创建一个媒体查询并提供一个 `当前` 属性,该属性反映是否匹配。 请谨慎使用它——在服务器端渲染期间,无法知道正确的值应该是什么,这可能会导致内容在激活时发生变化。如果您可以使用 CSS 中的媒体查询达到相同的效果,请这样做。 ```svelte
The time is {formatter.format(date)}
``` ```dts class SvelteDate extends Date {/*…*/} ``` ```dts constructor(...params: any[]); ``` ## SvelteMap 一个内置的 [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) 对象的响应式版本。通过迭代或通过读取 `map.size` 或调用 `map.get(...)` 或 `map.has(...)`(如下面的 [井字棋示例](/playground/0b0ff4aa49c9443f9b47fe5203c78293) 所示)来读取映射的内容,在 [效果](/docs/svelte/$effect) 或 [派生](/docs/svelte/$derived) 中将导致在映射更新时按需重新评估。 请注意,在响应式映射中的值 *不是* 深度响应的 [deeply reactive](/docs/svelte/$state#Deep-state)。 ```svelte{winner} wins!
{:else}{player} is next
{/if} ``` ```dts class SvelteMapsee no evil
{/if} {#if monkeys.has('🙉')}hear no evil
{/if} {#if monkeys.has('🙊')}speak no evil
{/if} ``` ```dts class SvelteSet?{params.toString()}
{#each params as [key, value]}{key}: {value}
{/each} ``` ```dts class SvelteURLSearchParams extends URLSearchParams {/*…*/} ``` ```dts [REPLACE](params: URLSearchParams): void; ``` ## 创建订阅者 > 自 5.7.0 版本起可用 返回一个将外部基于事件的系统与 Svelte 的响应性集成的`subscribe`函数。它特别适用于与 Web API 如`MediaQuery`、`IntersectionObserver`或`WebSocket`集成。 如果在内联(包括间接地,例如在 getter 中)调用 `subscribe`,则将使用 `update` 函数调用 `start` 回调。每当调用 `update` 时,效果将重新运行。 如果`start`返回一个清理函数,则在效果被销毁时将调用该函数。 如果在一个或多个效果中调用 `subscribe`,只要效果处于活动状态,`start` 将只会被调用一次,并且当所有效果被销毁时,返回的 teardown 函数才会被调用。 以示例来理解最为直观。以下是对[`MediaQuery`](/docs/svelte/svelte-reactivity#MediaQuery)的一个实现: ```js // @errors: 7031 import { createSubscriber } from 'svelte/reactivity'; import { on } from 'svelte/events'; export class MediaQuery { #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` const off = on(this.#query, 'change', update); // stop listening when all the effects are destroyed return () => off(); }); } get current() { // This makes the getter reactive, if read in an effect this.#subscribe(); // Return the current state of the query, whether or not we're in an effect return this.#query.matches; } } ``` ```dts function createSubscriber( start: (update: () => void) => (() => void) | void ): () => void; ```