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

相关文章

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

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

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

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

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

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

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

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

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何评价Ubuntu 24.04 LTS? Ubuntu 24.04 LTS新功能亮点和重要变化

《如何评价Ubuntu24.04LTS?Ubuntu24.04LTS新功能亮点和重要变化》Ubuntu24.04LTS即将发布,带来一系列提升用户体验的显著功能,本文深入探讨了该版本的亮... Ubuntu 24.04 LTS,代号 Noble NumBAT,正式发布下载!如果你在使用 Ubuntu 23.