当前位置: 首页 > news >正文

[React]监听Form中某个字段的变化

前言

有这样一个需求,整个组件是一个表单,在表单中,如果某一个字段的值发生了变化,那需要根据逻辑关系渲染不同的表单项。

form.getFieldValue()

使用getFieldValue可以获取form表单中的值,于是有了如下代码:

const [form] = Form.useForm();
const input = form.getFieldValue('input');<Form form={form}><Form.Item label="输入值" name="input"><Input /></Form.Item>{input?.length > 0 && <div>输入的值是:{input}</div>}
</Form>;

但是发现一个问题,这里即使input发生了变化,也并不会触发UI更新。简单来说,form.getFieldValue取到的值并不是一个 state。
那是否可以把此处的input字段设置一个state呢?

const [input, setInput] = useState('');<Input onChange={(event) => setInput(event.target.value)} />

那么这里就要保持表单中值和state中input值的同步,必须手动维护二者的关系,如果这种值很多,会造成非常混乱的逻辑,不推荐这样的作法。

Form.useWatch

从 antd@4.20.0 开始,antd Form 添加了一个新的 API Form.useWatch,用于处理此种情况。

const [form] = Form.useForm();
const inputValue = Form.useWatch('input', form);<Form form={form}><Form.Item label="输入值" name="input"><Input /></Form.Item>{inputValue ?.length > 0 && <div>输入的值是:{inputValue }</div>}
</Form>;

Form.useWatch 其实就是把 inputValue 变为了一个 state,然后内部处理了表单联动。state 的问题就是,它会触发整个组件的 re-render,进行不必要的 diff,如果组件很大而且是监听 Input 实时输入,这种性能消耗是很恐怖的,每次按键都是一次全量 diff。
而这种 re-render 其实毫无意义,因为我们 “精准” 的知道,就是要监听 song 字段的变化,根据 song 的值来更新 “局部” 的 UI,而不是更新整体 UI。

Watch组件

Ant Plus 5(antx)中提供了一个 Watch 组件,专用于监听表单字段变化,并更新局部 UI 的需求。

import { Form, Watch, Input } from 'antx';const [form] = Form.useForm();<Form form={form}><Input label="输入值" name="input" /><Watch name="input">{(inputValue) => {// 仅此处 UI 更新,不会每次输入都触发整个组件 re-renderreturn inputValue?.length > 0 && <div>输入值:{inputValue}</div>;}}</Watch>
</Form>;
http://www.dtcms.com/a/360689.html

相关文章:

  • vue2》》Computed、Watch
  • 【Vue2 ✨】Vue2 入门之旅(四):生命周期钩子
  • Git从零到远程协作:手把手实战指南
  • C 语言进程通信之信号API
  • [线上问题排查]1.数据库死锁全解析与解决方案
  • 算法:插入排序
  • LeetCode 刷题【58. 最后一个单词的长度、59. 螺旋矩阵 II】
  • 【开题答辩全过程】以 基于SSM的拾光咖啡厅管理系统的设计与实现为例,包含答辩的问题和答案
  • Introduction to GIS —— Chapter 4(Raster Data Model)
  • 批量修改用户密码的命令chpasswd
  • FTP - 学习/实践
  • JPEG XS概述
  • 草图大师SketchUp 2025下载安装教程与胚子库插件包安装for SketchUp 2025安装教程
  • 【AI智能体】LLM记账智能体+MCP服务-实现步骤与效果展示
  • 网络流量分析——使用Wireshark进行分析
  • SW - 用装配图的方式组合多个子零件然后转换成为零件,可维护性好
  • DRF快速构建RESTful API指南
  • 告别强化学习?GEPA:用“反思性提示词进化”实现超越的新范式
  • 【机器学习】-torch相关知识01
  • shell 命令拓展二——流程控制
  • springboot项目启动时打印maven打包时间
  • 华秋DFM检查PCB设计缺陷、一键导出Gerber、BOM、坐标文件
  • 平面椭圆转化为三阶Bezier曲线的方法
  • 目标检测算法YOLOv4详解
  • cloudflare 负载均衡器介绍
  • 用 MATLAB 实现遗传算法求解一元函数极值:从代码到实践
  • JS实现默认显示部分文字点击按钮显示全部内容
  • 使用组合子构建抽象语法树
  • 24数学建模国赛C
  • Linux性能调试工具之ftrace