React 表单Form 中的 useWatch

1、useWatch 介绍

  • 1、useWatch 是 React Hook Form 库提供的一个 hook,用于在表单中观察字段的值变化。
  • 2、useWatch 主要用于监听和获取表单字段的值,而不需要重新渲染整个表单。你可以选择监听单个字段、多个字段或整个表单的变化。
  • 3、松实现动态、响应式的表单行为。

2、基本用法

bash 复制代码
import { useForm, useWatch } from 'react-hook-form';

function MyForm() {
  const { control, handleSubmit } = useForm();
  
  // 使用 useWatch 监听某个字段的变化
  const watchedValue = useWatch({
    control,
    name: 'fieldName',  // 你希望监听的字段名称
  });

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input
        {...register('fieldName')}
        placeholder="Type something"
      />
      <p>Watched Value: {watchedValue}</p>
      <button type="submit">Submit</button>
    </form>
  );
}

在上面的例子中,useWatch 会监听字段 fieldName 的值,当该字段的值发生变化时,watchedValue 会自动更新并在组件中渲染。

3、useWatch 的参数

useWatch 接受一个对象作为参数,以下是常用参数:

  • control:useForm hook 返回的 control 对象,用于控制表单的状态。
  • name:你希望监听的字段名称,可以是单个字段名或者字段名数组。
  • defaultValue:可选参数,用于设置默认值。如果你没有设置 defaultValue,useWatch 会在第一次渲染时返回 undefined,直到表单状态更新。
  • disabled:是否禁用表单字段的监听。
bash 复制代码
useWatch({
  control,          // 必须,来自 useForm
  name: 'myField',   // 监听的字段名
  defaultValue: '',  // 可选的默认值
});

4、监听多个字段

bash 复制代码
const { control } = useForm();
const watchedValues = useWatch({
  control,
  name: ['field1', 'field2'],
});

console.log(watchedValues);

在这个例子中,watchedValues 将是一个对象,包含两个字段的值:

bash 复制代码
{
  field1: 'value1',
  field2: 'value2',
}

5、监听整个表单

如果你需要监听整个表单的变化,可以不传 name 参数,这样 useWatch 会返回整个表单的当前值。

bash 复制代码
const watchedFormValues = useWatch({
  control,
});

console.log(watchedFormValues);

这里,watchedFormValues 将包含整个表单的值。

6、与 useEffect 一起使用

你可以将 useWatch 与 useEffect 配合使用,在表单字段值变化时执行某些副作用操作。

bash 复制代码
import { useForm, useWatch } from 'react-hook-form';
import { useEffect } from 'react';

function MyForm() {
  const { control, handleSubmit } = useForm();
  const watchedValue = useWatch({
    control,
    name: 'fieldName',
  });

  useEffect(() => {
    if (watchedValue) {
      console.log('Field value changed:', watchedValue);
    }
  }, [watchedValue]);

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input
        {...register('fieldName')}
        placeholder="Type something"
      />
      <button type="submit">Submit</button>
    </form>
  );
}
相关推荐
钮钴禄·爱因斯晨2 分钟前
他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!
java·开发语言·前端·javascript·css·html
Watermelo6172 分钟前
理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
前端·javascript·vue.js·chrome·nginx·正则表达式·seo
Beingchou40 分钟前
HTML头部元信息避坑指南大纲
前端·html
Hello--_--World1 小时前
JS:this指向、bind、call、apply、知识点与相关面试题
开发语言·javascript·ecmascript
jserTang1 小时前
手撕 Claude Code-4: TodoWrite 与任务系统
前端·javascript·后端
腹黑天蝎座1 小时前
大屏开发必读:Scale/VW/Rem/流式/断点/混合方案全解析(附完整demo)
前端·javascript
jserTang1 小时前
手撕 Claude Code-5:Subagent 与 Agent Teams
前端·javascript·后端
于慨2 小时前
mac安装flutter
javascript·flutter·macos
踩着两条虫2 小时前
VTJ.PRO的平台介绍与特性
前端·架构·ai编程
光影少年2 小时前
前端工程化升级
前端·javascript·react.js·前端框架