Antd Form黑科技-监听表单值变化

2024-08-22 03:28

本文主要是介绍Antd Form黑科技-监听表单值变化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

useFormWatch

为啥要写这个hooks?主要是因为我们页面antd使用的是4.0版本,当时5.0还没有支持,而在一些业务场景中我需要监听某个表单值的变化来做一些回调处理,而Form组件的propsonValuesChange需要集中一个地方来写这些回调又不太方便于是便翻到了源码中RC_FORM_INTERNAL_HOOKS这个antd内置hooks事件,可以用来监听

import { FormInstance } from 'antd';
import { useEffect, useRef } from 'react';export default function useFormWatch(fn: (v: { [x: string]: any }) => void,form?: FormInstance<any>,keyDeps: string[],
) {const preValue = useRef({});const preValueKey = Object.keys(preValue.current);// 删除不需要监控keypreValueKey.forEach((key) => {if (!keyDeps.includes(key)) {delete preValue.current[key];}});// 新增监控keykeyDeps.forEach((key) => {if (typeof key != 'string') {throw new Error('keyDeps must be string');}if (!preValueKey.includes(key)) {preValue.current[key] = undefined;}});useEffect(() => {if (!form) {return;}const formValue = form.getFieldsValue();Object.keys(preValue.current).forEach((key) => {preValue.current[key] = formValue[key];});}, [Object.keys(preValue.current).join(), form]);useEffect(() => {if (!form) {return;}/*** 表单初始化是异步的,在组件挂载时对应值可能还没有赋值* https://github1s.com/react-component/field-form/blob/HEAD/src/useForm.ts#L99-L100*///@ts-ignoreconst destroyWatch = form?.getInternalHooks('RC_FORM_INTERNAL_HOOKS')?.registerWatch((value: any) => {const obj = {};keyDeps.forEach((key) => {if (value[key] != preValue.current[key]) {obj[key] = value[key];preValue.current[key] = value[key];}});if (Object.keys(obj)?.length) {fn(obj);}});return destroyWatch;}, [preValue, fn, form]);
}

官方useWatch

antd在5.0版本支持类似的api: useWatch 可以替代

https://ant.design/components/form-cn#formusewatch

https://github1s.com/react-component/field-form/blob/master/src/useWatch.ts#L140

这篇关于Antd Form黑科技-监听表单值变化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095100

相关文章

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

Python实现自动化表单填写功能

《Python实现自动化表单填写功能》在Python中,自动化表单填写可以通过多种库和工具实现,本文将详细介绍常用的自动化表单处理工具,并对它们进行横向比较,可根据需求选择合适的工具,感兴趣的小伙伴跟... 目录1. Selenium简介适用场景示例代码优点缺点2. Playwright简介适用场景示例代码

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn