假设您想要从 API 获取一些数据并将其用作表单的初始值。
虽然这个问题在表面上听起来很简单,但有一些您可能还没有想到的隐藏复杂性。
例如,您可能希望在获取数据时显示加载旋转器,或者您可能希望优雅地处理错误。 同样,您也可能发现自己在寻找一种缓存数据的方法,这样就不必每次渲染表单时都获取数据。
虽然我们可以从头开始实现许多这些功能,但最终看起来会很像我们维护的另一个项目:TanStack Query。
因此,本指南向您展示如何将 TanStack Form 与 TanStack Query 混合搭配以实现所需的行为。
<script>
import { createForm } from '@tanstack/svelte-form'
import { createQuery } from '@tanstack/svelte-query'
const { data, isLoading } = createQuery(() => ({
queryKey: ['data'],
queryFn: async () => {
await new Promise((resolve) => setTimeout(resolve, 1000))
return { firstName: 'FirstName', lastName: 'LastName' }
},
}))
const form = createForm(() => ({
defaultValues: {
firstName: $data?.firstName ?? '',
lastName: $data?.lastName ?? '',
},
onSubmit: async ({ value }) => {
// 对表单数据进行处理
console.log(value)
},
}))
</script>
{#if $isLoading}
<p>加载中...</p>
{:else}
<!-- 表单... -->
{/if}
<script>
import { createForm } from '@tanstack/svelte-form'
import { createQuery } from '@tanstack/svelte-query'
const { data, isLoading } = createQuery(() => ({
queryKey: ['data'],
queryFn: async () => {
await new Promise((resolve) => setTimeout(resolve, 1000))
return { firstName: 'FirstName', lastName: 'LastName' }
},
}))
const form = createForm(() => ({
defaultValues: {
firstName: $data?.firstName ?? '',
lastName: $data?.lastName ?? '',
},
onSubmit: async ({ value }) => {
// 对表单数据进行处理
console.log(value)
},
}))
</script>
{#if $isLoading}
<p>加载中...</p>
{:else}
<!-- 表单... -->
{/if}
这将显示加载旋转器,直到获取数据,然后使用获取的数据作为初始值渲染表单。