Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): add field listeners #1032

Merged
merged 15 commits into from
Nov 25, 2024
4 changes: 4 additions & 0 deletions docs/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@
"label": "Linked Fields",
"to": "framework/react/guides/linked-fields"
},
{
"label": "Listeners",
"to": "framework/react/guides/listeners"
},
{
"label": "UI Libraries",
"to": "framework/react/guides/ui-libraries"
Expand Down
19 changes: 19 additions & 0 deletions docs/framework/react/guides/basic-concepts.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,25 @@ const firstName = form.useStore((state) => state.values.firstName)

Note: The usage of the `form.useField` hook to achieve reactivity is discouraged since it is designed to be used thoughtfully within the `form.Field` component. You might want to use `form.useStore` instead.

## Listeners

`@tanstack/react-form` allows you to react to specific triggers and "listen" to them to dispatch side effects.

Example:

```tsx
<form.Field
name="country"
listener={{
onChange: ({ value }) => {
form.reset({county: ''})
harry-whorlow marked this conversation as resolved.
Show resolved Hide resolved
},
}}
/>
```

harry-whorlow marked this conversation as resolved.
Show resolved Hide resolved
More information can be found at [Listeners](./listeners.md)

## Array Fields

Array fields allow you to manage a list of values within a form, such as a list of hobbies. You can create an array field using the `form.Field` component with the `mode="array"` prop.
Expand Down
66 changes: 66 additions & 0 deletions docs/framework/react/guides/listeners.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
id: listeners
title: Side effects for event triggers
---

For situations where you want to "affect" or "react" to triggers, there's the listener API. For example, if you, as the developer, want to reset a form field as a result of another field changing, you would use the listener API.

Imagine the following user flow:

- User selects a country from a drop-down.
- User then selects a province from another drop-down.
- User changes the selected country to a different one.

In this example, when the user changes the country, the selected province needs to be reset as it's no longer valid. With the listener API, we can subscribe to the onChange event and dispatch a reset to the field "province" when the listener is fired.

Events that can be "listened" to are:

- onChange
- onBlur
- onMount
- onSubmit

```tsx
function App() {
const form = useForm({
defaultValues: {
country: '',
province: '',
},
// ...
})

return (
<div>
<form.Field name="country">
{(field) => (
<label>
<div>Country</div>
<input
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
listener={{
onChange: ({ value }) => {
form.reset({province: ''})
harry-whorlow marked this conversation as resolved.
Show resolved Hide resolved
}
}}
/>
</label>
)}
</form.Field>

<form.Field name="province">
{(field) => (
<label>
<div>Province</div>
<input
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
/>
</label>
)}
</form.Field>
</div>
)
}
```
48 changes: 24 additions & 24 deletions docs/reference/classes/fieldapi.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Initializes a new `FieldApi` instance.

#### Defined in

[packages/form-core/src/FieldApi.ts:440](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L440)
[packages/form-core/src/FieldApi.ts:509](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L509)

## Properties

Expand All @@ -59,7 +59,7 @@ A reference to the form API instance.

#### Defined in

[packages/form-core/src/FieldApi.ts:402](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L402)
[packages/form-core/src/FieldApi.ts:471](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L471)

***

Expand All @@ -73,7 +73,7 @@ The field name.

#### Defined in

[packages/form-core/src/FieldApi.ts:412](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L412)
[packages/form-core/src/FieldApi.ts:481](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L481)

***

Expand All @@ -87,7 +87,7 @@ The field options.

#### Defined in

[packages/form-core/src/FieldApi.ts:416](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L416)
[packages/form-core/src/FieldApi.ts:485](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L485)

***

Expand All @@ -101,7 +101,7 @@ The current field state.

#### Defined in

[packages/form-core/src/FieldApi.ts:430](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L430)
[packages/form-core/src/FieldApi.ts:499](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L499)

***

Expand All @@ -115,7 +115,7 @@ The field state store.

#### Defined in

[packages/form-core/src/FieldApi.ts:426](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L426)
[packages/form-core/src/FieldApi.ts:495](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L495)

***

Expand All @@ -127,7 +127,7 @@ timeoutIds: Record<ValidationCause, null | Timeout>;

#### Defined in

[packages/form-core/src/FieldApi.ts:435](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L435)
[packages/form-core/src/FieldApi.ts:504](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L504)

## Methods

Expand All @@ -145,7 +145,7 @@ Gets the field information object.

#### Defined in

[packages/form-core/src/FieldApi.ts:658](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L658)
[packages/form-core/src/FieldApi.ts:737](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L737)

***

Expand All @@ -163,7 +163,7 @@ Gets the current field metadata.

#### Defined in

[packages/form-core/src/FieldApi.ts:636](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L636)
[packages/form-core/src/FieldApi.ts:715](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L715)

***

Expand All @@ -185,7 +185,7 @@ Use `field.state.value` instead.

#### Defined in

[packages/form-core/src/FieldApi.ts:616](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L616)
[packages/form-core/src/FieldApi.ts:695](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L695)

***

Expand All @@ -203,7 +203,7 @@ Handles the blur event.

#### Defined in

[packages/form-core/src/FieldApi.ts:1010](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1010)
[packages/form-core/src/FieldApi.ts:1089](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1089)

***

Expand All @@ -225,7 +225,7 @@ Handles the change event.

#### Defined in

[packages/form-core/src/FieldApi.ts:1003](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1003)
[packages/form-core/src/FieldApi.ts:1082](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1082)

***

Expand Down Expand Up @@ -254,7 +254,7 @@ Inserts a value at the specified index, shifting the subsequent values to the ri

#### Defined in

[packages/form-core/src/FieldApi.ts:671](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L671)
[packages/form-core/src/FieldApi.ts:750](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L750)

***

Expand All @@ -276,7 +276,7 @@ Mounts the field instance to the form.

#### Defined in

[packages/form-core/src/FieldApi.ts:531](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L531)
[packages/form-core/src/FieldApi.ts:605](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L605)

***

Expand Down Expand Up @@ -305,7 +305,7 @@ Moves the value at the first specified index to the second specified index.

#### Defined in

[packages/form-core/src/FieldApi.ts:701](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L701)
[packages/form-core/src/FieldApi.ts:780](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L780)

***

Expand All @@ -329,7 +329,7 @@ Pushes a new value to the field.

#### Defined in

[packages/form-core/src/FieldApi.ts:663](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L663)
[packages/form-core/src/FieldApi.ts:742](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L742)

***

Expand All @@ -353,7 +353,7 @@ Removes a value at the specified index.

#### Defined in

[packages/form-core/src/FieldApi.ts:689](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L689)
[packages/form-core/src/FieldApi.ts:768](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L768)

***

Expand Down Expand Up @@ -382,7 +382,7 @@ Replaces a value at the specified index.

#### Defined in

[packages/form-core/src/FieldApi.ts:680](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L680)
[packages/form-core/src/FieldApi.ts:759](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L759)

***

Expand All @@ -404,7 +404,7 @@ Updates the field's errorMap

#### Defined in

[packages/form-core/src/FieldApi.ts:1025](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1025)
[packages/form-core/src/FieldApi.ts:1109](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1109)

***

Expand All @@ -426,7 +426,7 @@ Sets the field metadata.

#### Defined in

[packages/form-core/src/FieldApi.ts:652](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L652)
[packages/form-core/src/FieldApi.ts:731](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L731)

***

Expand All @@ -450,7 +450,7 @@ Sets the field value and run the `change` validator.

#### Defined in

[packages/form-core/src/FieldApi.ts:623](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L623)
[packages/form-core/src/FieldApi.ts:702](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L702)

***

Expand Down Expand Up @@ -479,7 +479,7 @@ Swaps the values at the specified indices.

#### Defined in

[packages/form-core/src/FieldApi.ts:695](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L695)
[packages/form-core/src/FieldApi.ts:774](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L774)

***

Expand All @@ -501,7 +501,7 @@ Updates the field instance with new options.

#### Defined in

[packages/form-core/src/FieldApi.ts:579](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L579)
[packages/form-core/src/FieldApi.ts:658](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L658)

***

Expand All @@ -523,4 +523,4 @@ Validates the field value.

#### Defined in

[packages/form-core/src/FieldApi.ts:975](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L975)
[packages/form-core/src/FieldApi.ts:1054](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1054)
Loading
Loading