Skip to main content

Svelte 中的响应式

为了优化渲染,Svelte 使用了一个编译器来构建源代码。 在 Svelte 中,默认情况下,除非变量(variables)在源码中被其他地方所引用,否则变量仅被赋值一次。 如要让不同的变量或函数具有响应性,你需要使用特殊的声明形式。 Svelte Query 也同样遵从这一点。

在下面的例子中,refetchInterval选项是从变量intervalMs赋值而来的,而该变量是从一个 input 框中编辑而来。 你可能觉得 input 的值变化将导致refetchInterval变化,然而因为没有任何东西被声明为响应式的,因此变量及查询都不会被改变:

<script lang="ts">
import { createQuery } from '@tanstack/svelte-query'

let intervalMs = 1000

const endpoint = 'http://localhost:5173/api/data'

const query = createQuery({
queryKey: ['refetch'],
queryFn: async () => await fetch(endpoint).then((r) => r.json()),
refetchInterval: intervalMs,
})
</script>

<input bind:value={intervalMs} type="number" />

解决方法很简单,遵从规则添加一个$: 前缀给 query,则编译器将自动触发响应式逻辑

<script lang="ts">
import { createQuery } from '@tanstack/svelte-query'

let intervalMs = 1000

const endpoint = 'http://localhost:5173/api/data'

$: query = createQuery({
queryKey: ['refetch'],
queryFn: async () => await fetch(endpoint).then((r) => r.json()),
refetchInterval: intervalMs,
})
</script>

<input bind:value={intervalMs} type="number" />