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>
  );
}
相关推荐
六月June June4 小时前
自定义调色盘组件
前端·javascript·调色盘
SY_FC4 小时前
实现一个父组件引入了子组件,跳转到其他页面,其他页面返回回来重新加载子组件函数
java·前端·javascript
糟糕好吃4 小时前
我让 AI 操作网页之后,开始不想点按钮了
前端·javascript·后端
陈天伟教授5 小时前
人工智能应用- 天文学家的助手:08. 星系定位与分类
前端·javascript·数据库·人工智能·机器学习
VaJoy5 小时前
给到夯!前端工具链新标杆 Vite Plus 初探
前端·vite
颜酱6 小时前
BFS 与并查集实战总结:从基础框架到刷题落地
javascript·后端·算法
小彭努力中6 小时前
191.Vue3 + OpenLayers 实战:可控化版权信息(Attribution)详解与完整示例
前端·javascript·vue.js·#地图开发·#cesium
奇舞精选6 小时前
用去年 github 最火的 n8n 快速实现自动化推送工具
前端·agent
奇舞精选6 小时前
实践:如何为智能体推理引入外部决策步骤
前端·agent
无限大67 小时前
AI实战02:一个万能提示词模板,搞定90%的文案/设计/分析需求
前端·后端