</> watch:
いくつかのオーバーロード
このメソッドは指定された入力情報を監視し、その値を返します。入力値をレンダリングしたり、条件によって決定するレンダリング内容を特定する場合に便利です。
オーバーロード
この関数は主に2つの目的があります
- フィールドの値と同期し、返します。 a.
watch(name: string, defaultValue?): unknown
b.watch(names: string[], defaultValue?): {[key:string]: unknown}
c.watch(): {[key:string]: unknown}
- 指定されたコールバック関数を使用してサブスクライブを開始します(
unsubscribe
関数を呼び出すことで停止できます)。 a.watch(callback: (data, { name, type }) => void, defaultValues?): { unsubscribe: () => void }
この4つのオーバーロードのそれぞれについて以下に説明します。
1-a. 単一フィールドの監視 watch(name: string, defaultValue?: unknown): unknown
レンダリングの外側で使用される1つのフィールドを監視し、サブスクライブします。
パラメーター
名前 | タイプ | 説明 |
---|---|---|
name | 文字列 | フィールド名 |
defaultValue | 不明 | オプション. フィールドの既定値 |
返します 単一フィールドの値。
const name = watch("name")
1-b. 複数のフィールドの監視 watch(names: string[], defaultValue?: {[key:string]: unknown}): unknown[]
レンダリングの外側で使用されるフィールドの配列を監視し、サブスクライブします。
パラメーター
名前 | タイプ | 説明 |
---|---|---|
names | 文字列の配列 | フィールド名 |
defaultValue | {[key:string]: unknown} | オプション. フィールドの既定値 |
返します フィールド値の配列。
const [name, name1] = watch(["name", "name1"])
1-c. フォーム全体の監視 watch(): {[key:string]: unknown}
onChange に基づいてフォーム全体の更新/変更を監視およびサブスクライブし、useForm で再レンダリングします。
パラメーター なし
返します フォーム全体の値。
const formValues = watch()
2. コールバック関数を使用して監視を開始 watch(callback: (data, { name, type }) => void, defaultValues?: {[key:string]: unknown}): { unsubscribe: () => void }
再レンダリングをトリガーせずにフィールドの更新/変更をサブスクライブします。
パラメーター
名前 | タイプ | 説明 |
---|---|---|
callback | (data, { name, type }) => void | すべてのフィールドの変更をサブスクライブするコールバック関数 |
defaultValues | {[key:string]: unknown} | オプション. フォーム全体の既定値 |
返します unsubscribe
関数を含むオブジェクト。
useEffect(() => {const { unsubscribe } = watch((value) => {console.log(value)})return () => unsubscribe()}, [watch])
ルール
defaultValue
が定義されていない場合、watch
の最初のレンダリングはundefined
を返します。これはregister
の前に呼び出されるからです。この動作を回避するには、useForm
にdefaultValues
を指定することを推奨しますが、インラインのdefaultValue
を 2 番目の引数として設定できます。defaultValue
とdefaultValues
の両方が指定されている場合、defaultValue
が返されます。- この API は、アプリケーションまたはフォームのルートで再レンダリングをトリガーします。パフォーマンスの問題が発生した場合は、コールバックまたは useWatch API の使用を検討してください。
watch
の結果は、useEffect
の依存関係ではなく、レンダリングフェーズ用に最適化されています。値の更新を検出するには、値の比較用の外部カスタムフックを使用することを検討してください。
例
フォームでの監視
import React from "react"import { useForm } from "react-hook-form"interface IFormInputs {name: stringshowAge: booleanage: number}function App() {const {register,watch,formState: { errors },handleSubmit,} = useForm<IFormInputs>()const watchShowAge = watch("showAge", false) // you can supply default value as second argumentconst watchAllFields = watch() // when pass nothing as argument, you are watching everythingconst watchFields = watch(["showAge", "age"]) // you can also target specific fields by their names// Callback version of watch. It's your responsibility to unsubscribe when done.React.useEffect(() => {const subscription = watch((value, { name, type }) =>console.log(value, name, type))return () => subscription.unsubscribe()}, [watch])const onSubmit = (data: IFormInputs) => console.log(data)return (<><form onSubmit={handleSubmit(onSubmit)}><input {...register("name", { required: true, maxLength: 50 })} /><input type="checkbox" {...register("showAge")} />{/* based on yes selection to display Age Input*/}{watchShowAge && (<input type="number" {...register("age", { min: 50 })} />)}<input type="submit" /></form></>)}
フィールド配列での監視
import * as React from "react"import { useForm, useFieldArray } from "react-hook-form"type FormValues = {test: {firstName: stringlastName: string}[]}function App() {const { register, control, handleSubmit, watch } = useForm<FormValues>()const { fields, remove, append } = useFieldArray({name: "test",control,})const onSubmit = (data: FormValues) => console.log(data)console.log(watch("test"))return (<form onSubmit={handleSubmit(onSubmit)}>{fields.map((field, index) => {return (<div key={field.id}><inputdefaultValue={field.firstName}{...register(`test.${index}.firstName`)}/><inputdefaultValue={field.lastName}{...register(`test.${index}.lastName`)}/><button type="button" onClick={() => remove(index)}>Remove</button></div>)})}<buttontype="button"onClick={() =>append({firstName: "bill" + renderCount,lastName: "luo" + renderCount,})}>Append</button></form>)}
ビデオ
サポートいただきありがとうございます
プロジェクトで React Hook Form が役立つ場合、スターを付けてサポートしてください。