Skip to content

Commit 93f9d3d

Browse files
authored
setvalue to mdx (#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)