当前位置: 首页 > 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.xdnf.cn/news/1424881.html

相关文章:

  • 微算法科技(NASDAQ:MLGO)张量网络与机器学习融合,MPS分类器助力顶夸克信号识别
  • deepseek doubao chatgpt 优缺点分析
  • 并发--并发中的线程状态及不同状态下线程所在队列
  • React学习教程,从入门到精通, React 入门指南:创建 React 应用程序的语法知识点(7)
  • OpenCV-CUDA 图像处理
  • 数据库常见故障类型
  • 知识产品和标准化
  • 在 Qt 中加载 .qm 翻译文件
  • 跳跃游戏(二):DFS 求解最少跳跃次数与最优路径
  • 专项智能练习(Word)
  • JavaSE:抽象类和接口
  • 计算机视觉(五):blur
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • 贵州在假期及夏天结束后保持旅游活力的策略分析
  • AI如何重塑电力工程设计?揭秘良策金宝AI的六大“超能力”
  • SQLSERVER关键字:N
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 算法练习——189.轮转数组
  • 【逆序对 博弈】P10737 [SEERC 2020] Reverse Game|普及+
  • 【开题答辩全过程】以 基于JSP的养生网站设计与实现为例,包含答辩的问题和答案
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • Linux 进程间通信(IPC)
  • 大型语言模型微调 内容预告(69)
  • 【Docker】2025版Ubuntu 22.04 安装 Docker Docker Compose 指南
  • 电力工程师的AI时代已来,这6大功能彻底颠覆传统工作模式
  • 系统性学习数据结构-第二讲-顺序表与链表
  • 金融数据安全
  • 基于单片机汽车防盗系统/汽车安全防丢系统
  • 动态代理设计模式
  • 多模态大语言模型部署