diff --git a/docs/framework/vue/quick-start.md b/docs/framework/vue/quick-start.md
index 5c40bc389..623729bcc 100644
--- a/docs/framework/vue/quick-start.md
+++ b/docs/framework/vue/quick-start.md
@@ -28,7 +28,7 @@ form.provideFormContext()
-
+
-
+
field.handleChange(e.target.value)"
+ @input="
+ (e) => field.handleChange((e.target as HTMLInputElement).value)
+ "
@blur="field.handleBlur"
/>
@@ -59,12 +61,14 @@ async function onChangeFirstName(value) {
-
+
field.handleChange(e.target.value)"
+ @input="
+ (e) => field.handleChange((e.target as HTMLInputElement).value)
+ "
@blur="field.handleBlur"
/>
diff --git a/packages/vue-form/src/tests/useField.test.tsx b/packages/vue-form/src/tests/useField.test.tsx
index c5ef279b1..58fe62392 100644
--- a/packages/vue-form/src/tests/useField.test.tsx
+++ b/packages/vue-form/src/tests/useField.test.tsx
@@ -30,7 +30,7 @@ describe('useField', () => {
return () => (
- {(field: FieldApi) => (
+ {({ field }: { field: FieldApi }) => (
{
name="firstName"
onChange={(value) => (value === 'other' ? error : undefined)}
>
- {(field: FieldApi) => (
+ {({ field }: { field: FieldApi }) => (
{
name="firstName"
onChange={(value) => (value === 'other' ? error : undefined)}
>
- {(field: FieldApi
) => (
+ {({ field }: { field: FieldApi }) => (
{
return error
}}
>
- {(field: FieldApi
) => (
+ {({ field }: { field: FieldApi }) => (
{
return error
}}
>
- {(field: FieldApi
) => (
+ {({ field }: { field: FieldApi }) => (
{
return () => (
- {(field: FieldApi) => (
+ {({ field }: { field: FieldApi }) => (
{
return () => (
- {(field: FieldApi) => {field.state.value}
}
+ {({ field }: { field: FieldApi }) => (
+ {field.state.value}
+ )}
)
})
@@ -96,7 +98,11 @@ describe('useForm', () => {
return () => (
- {(field: FieldApi) => {
+ {({
+ field,
+ }: {
+ field: FieldApi
+ }) => {
return (
= TFormData extends any[]
// // ^?
export type FieldComponent = (
- fieldOptions: {
- children?: (
- fieldApi: FieldApi, TFormData>,
- ) => any
- } & Omit<
+ fieldOptions: Omit<
UseFieldOptions, TFormData>,
'name' | 'index'
> &
@@ -130,7 +121,15 @@ export type FieldComponent = (
name: TField extends undefined ? TField : DeepKeys
index?: never
}),
- context: SetupContext,
+ context: SetupContext<
+ {},
+ SlotsType<{
+ default: {
+ field: FieldApi, TFormData>
+ state: FieldState
+ }
+ }>
+ >,
) => any
export const Field = defineComponent(
@@ -145,7 +144,11 @@ export const Field = defineComponent(
parentFieldName: fieldApi.api.name,
} as never)
- return () => context.slots.default!(fieldApi.api, fieldApi.state.value)
+ return () =>
+ context.slots.default!({
+ field: fieldApi.api,
+ state: fieldApi.state.value,
+ })
},
{ name: 'Field', inheritAttrs: false },
)
diff --git a/packages/vue-form/src/useForm.tsx b/packages/vue-form/src/useForm.tsx
index f13ce870a..51f7e8c7c 100644
--- a/packages/vue-form/src/useForm.tsx
+++ b/packages/vue-form/src/useForm.tsx
@@ -2,7 +2,12 @@ import { FormApi, type FormState, type FormOptions } from '@tanstack/form-core'
import { useStore } from '@tanstack/vue-store'
import { type UseField, type FieldComponent, Field, useField } from './useField'
import { provideFormContext } from './formContext'
-import { defineComponent } from 'vue-demi'
+import {
+ type EmitsOptions,
+ type SlotsType,
+ type SetupContext,
+ defineComponent,
+} from 'vue-demi'
import type { NoInfer } from './types'
declare module '@tanstack/form-core' {
@@ -15,9 +20,15 @@ declare module '@tanstack/form-core' {
useStore: >>(
selector?: (state: NoInfer>) => TSelected,
) => TSelected
- Subscribe: >>(props: {
- selector?: (state: NoInfer>) => TSelected
- }) => any
+ Subscribe: >>(
+ props: {
+ selector?: (state: NoInfer>) => TSelected
+ },
+ context: SetupContext<
+ EmitsOptions,
+ SlotsType<{ default: NoInfer> }>
+ >,
+ ) => any
}
}