假设您想从 API 获取一些数据并将其用作表单的初始值。
虽然这个问题表面上看起来很简单,但其中也隐藏着您可能尚未想到的复杂性。
例如,您可能希望在数据正在获取时显示加载指示器,或者您可能希望优雅地处理错误。
同样,您也可能想找到一种方法来缓存数据,这样在表单每次渲染时就不必再次获取数据。
虽然我们可以从头开始实现其中许多功能,但这最终会与我们维护的另一个项目非常相似:TanStack Query。
因此,本指南将向您展示如何将 TanStack Form 与 TanStack Query 结合使用以实现所需行为。
<script setup lang="ts">
import { useForm } from '@tanstack/vue-form'
import { useQuery } from '@tanstack/vue-query'
import { watchEffect, reactive } from 'vue'
const { data, isLoading } = useQuery({
queryKey: ['data'],
queryFn: async () => {
await new Promise((resolve) => setTimeout(resolve, 1000))
return { firstName: 'FirstName', lastName: 'LastName' }
},
})
const firstName = computed(() => data.value?.firstName || '')
const lastName = computed(() => data.value?.lastName || '')
const defaultValues = reactive({
firstName,
lastName,
})
const form = useForm({
defaultValues,
onSubmit: async ({ value }) => {
// Do something with form data
console.log(value)
},
})
</script>
<template>
<p v-if="isLoading">Loading..</p>
<form v-else @submit.prevent.stop="form.handleSubmit">
<!-- ... -->
</form>
</template>
<script setup lang="ts">
import { useForm } from '@tanstack/vue-form'
import { useQuery } from '@tanstack/vue-query'
import { watchEffect, reactive } from 'vue'
const { data, isLoading } = useQuery({
queryKey: ['data'],
queryFn: async () => {
await new Promise((resolve) => setTimeout(resolve, 1000))
return { firstName: 'FirstName', lastName: 'LastName' }
},
})
const firstName = computed(() => data.value?.firstName || '')
const lastName = computed(() => data.value?.lastName || '')
const defaultValues = reactive({
firstName,
lastName,
})
const form = useForm({
defaultValues,
onSubmit: async ({ value }) => {
// Do something with form data
console.log(value)
},
})
</script>
<template>
<p v-if="isLoading">Loading..</p>
<form v-else @submit.prevent.stop="form.handleSubmit">
<!-- ... -->
</form>
</template>
这将显示一个加载文本,直到数据被获取,然后它将使用获取的数据作为初始值来渲染表单。
您的每周 JavaScript 资讯。每周一免费发送给超过 10 万开发者。