Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 93f9d3d

Browse files
authored
setvalue to mdx (react-hook-form#1116)
1 parent 55420fb commit 93f9d3d

File tree

6 files changed

+177
-177
lines changed

6 files changed

+177
-177
lines changed

‎src/components/codeExamples/setValue.ts

Lines changed: 0 additions & 26 deletions
This file was deleted.

‎src/components/codeExamples/setValueTs.tsx

Lines changed: 0 additions & 27 deletions
This file was deleted.

‎src/components/codeExamples/setValueTypes.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

‎src/components/useForm/SetValue.tsx

Lines changed: 0 additions & 83 deletions
This file was deleted.

‎src/content/docs/useform/setvalue.mdx

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
---
2+
title: setValue
3+
description: Update field value
4+
sidebar: apiLinks
5+
---
6+
7+
## \</> `setValue:` <TypeText>(name: string, value: unknown, config?: SetValueConfig) => void</TypeText>
8+
9+
This function allows you to dynamically set the value of a <strong>registered</strong> field and have the options to validate and update the form state. At the same time, it tries to avoid unnecessary rerender.
10+
11+
### Props
12+
13+
---
14+
15+
| Name | | Description |
16+
| ---------------------------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
17+
| `name`<br/><TypeText>string</TypeText> | | Target a single field or field array by name. |
18+
| `value`<br/><TypeText>unknown</TypeText> | | The value for the field. This argument is required and can not be `undefined`. |
19+
| `options` | `shouldValidate`<br/><TypeText>boolean</TypeText> | <ul><li>Whether to compute if your input is valid or not (subscribed to <TypeText>errors</TypeText>).</li><li>Whether to compute if your entire form is valid or not (subscribed to <TypeText>isValid</TypeText>).</li>This option will update `touchedFields` at the specified field level not the entire form touched fields.</ul> |
20+
| | `shouldDirty`<br/><TypeText>boolean</TypeText> | <ul><li>Whether to compute if your input is dirty or not against your `defaultValues` (subscribed to <TypeText>dirtyFields</TypeText>).</li><li>Whether to compute if your entire form is dirty or not against your `defaultValues` (subscribed to <TypeText>isDirty</TypeText>).</li><li>This option will update `dirtyFields` at the specified field level not the entire form dirty fields.</li></ul> |
21+
| | `shouldTouch`<br/><TypeText>boolean</TypeText> | Whether to set the input itself to be touched. |
22+
23+
<Admonition type="important" title="Rules">
24+
25+
- You can use methods such as [replace](/docs/usefieldarray#replace) or [update](/docs/usefieldarray#update) for field array, however, they will cause the component to unmount and remount for the targeted field array.
26+
27+
```javascript
28+
const { update } = useFieldArray({ name: "array" })
29+
30+
// unmount fields and remount with updated value
31+
update(0, { test: "1", test1: "2" })
32+
33+
// will directly update input value
34+
setValue("array.0.test1", "1")
35+
setValue("array.0.test2", "2")
36+
```
37+
38+
- The method will not create a new field when targeting a non-existing field.
39+
40+
```javascript
41+
const { replace } = useFieldArray({ name: "test" })
42+
43+
// ❌ doesn't create new input
44+
setValue("test.101.data")
45+
46+
// ✅ work on refresh entire field array
47+
replace([{ data: "test" }])
48+
```
49+
50+
- Only the following conditions will trigger a re-render:
51+
52+
- When an error is triggered or corrected by a value update.
53+
- When `setValue` cause state update, such as dirty and touched.
54+
55+
- It's recommended to target the field's name rather than make the second argument a nested object.
56+
57+
```javascript
58+
setValue("yourDetails.firstName", "value") // ✅ performant
59+
setValue("yourDetails", { firstName: "value" }) ❌ // less performant
60+
61+
register("nestedValue", { value: { test: "data" } }) // register a nested value input
62+
setValue("nestedValue.test", "updatedData") // ❌ failed to find the relevant field
63+
setValue("nestedValue", { test: "updatedData" }) // ✅ setValue find input and update
64+
```
65+
66+
- It's recommended to register the input's name before invoking `setValue`. To update the entire `FieldArray`, make sure the `useFieldArray` hook is being executed first.
67+
68+
**Important:** use `replace` from `useFieldArray` instead, update entire field array with `setValue` will be removed in the next major version.
69+
70+
```javascript
71+
// you can update an entire Field Array,
72+
setValue("fieldArray", [{ test: "1" }, { test: "2" }]) //
73+
74+
// you can setValue to a unregistered input
75+
setValue("notRegisteredInput", "value") // ✅ prefer to be registered
76+
77+
// the following will register a single input (without register invoked)
78+
setValue("resultSingleNestedField", { test: "1", test2: "2" }) // 🤔
79+
80+
// with registered inputs, the setValue will update both inputs correctly.
81+
register("notRegisteredInput.test", "1")
82+
register("notRegisteredInput.test2", "2")
83+
setValue("notRegisteredInput", { test: "1", test2: "2" }) // ✅ sugar syntax to setValue twice
84+
```
85+
86+
</Admonition>
87+
88+
### Examples
89+
90+
---
91+
92+
**Basic**
93+
94+
```javascript sandbox="https://codesandbox.io/s/react-hook-form-v7-ts-setvalue-8z9hx"
95+
import { useForm } from "react-hook-form"
96+
97+
const App = () => {
98+
const { register, setValue } = useForm({
99+
firstName: "",
100+
})
101+
102+
return (
103+
<form>
104+
<input {...register("firstName", { required: true })} />
105+
<button onClick={() => setValue("firstName", "Bill")}>setValue</button>
106+
<button
107+
onClick={() =>
108+
setValue("firstName", "Luo", {
109+
shouldValidate: true,
110+
shouldDirty: true,
111+
})
112+
}
113+
>
114+
setValue options
115+
</button>
116+
</form>
117+
)
118+
}
119+
```
120+
121+
**Dependant Fields**
122+
123+
```typescript sandbox="https://codesandbox.io/s/dependant-field-dwin1"
124+
import * as React from "react";
125+
import { useForm } from "react-hook-form";
126+
127+
type FormValues = {
128+
a: string;
129+
b: string;
130+
c: string;
131+
};
132+
133+
export default function App() {
134+
const { watch, register, handleSubmit, setValue, formState } = useForm<
135+
FormValues
136+
>({
137+
defaultValues: {
138+
a: "",
139+
b: "",
140+
c: ""
141+
}
142+
});
143+
const onSubmit = (data: FormValues) => console.log(data);
144+
const [a, b] = watch(["a", "b"]);
145+
146+
React.useEffect(() => {
147+
if (formState.touchedFields.a && formState.touchedFields.b && a && b) {
148+
setValue("c", `${a} ${b}`);
149+
}
150+
}, [setValue, a, b, formState]);
151+
152+
return (
153+
<form onSubmit={handleSubmit(onSubmit)}>
154+
<input {...register("a")} placeholder="a" />
155+
<input {...register("b")} placeholder="b" />
156+
<input {...register("c")} placeholder="c" />
157+
<input type="submit" />
158+
159+
<button
160+
type="button"
161+
onClick={() => {
162+
setValue("a", "what", { shouldTouch: true });
163+
setValue("b", "ever", { shouldTouch: true });
164+
}}
165+
>
166+
trigger value
167+
</button>
168+
</form>
169+
);
170+
}
171+
```
172+
173+
### Video
174+
175+
---
176+
177+
<YouTube youTubeId="qpv51sCH3fI" />

‎src/pages/docs/useform/setvalue.tsx

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /