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

react 表单管理

受控模式

import _ from 'lodash';
import cn from '@/utils/cn';
import * as api from '../api';
import { useState } from 'react';
import { match } from 'ts-pattern';type SubmitResult = { type: 'idle' | 'success' | 'error'; data: string };
type FormDataState = { uname: string; comment: string };const initDate = {submitResult: { type: 'idle', data: '' },formData: { uname: '', comment: '' },
};// React 18实现(受控来管理"表单")
export default function formDemo() {const [isPending, setIsPending] = useState(false);const [submitResult, setSubmitResult] = useState<SubmitResult>(_.cloneDeep(initDate.submitResult));const [formData, setFormData] = useState<FormDataState>(_.cloneDeep(initDate.formData));// 提交操作const handleSubmit = async () => {setIsPending(true);const finalFormData = new FormData();Object.entries(formData).forEach(([key, value]) => {finalFormData.append(key, value);});const res = await api.submitComment(finalFormData);setSubmitResult({ type: res.code === 0 ? 'success' : 'error', data: res.msg });setIsPending(false);};// 重置操作const handleReset = () => {setFormData(_.cloneDeep(initDate.formData));setSubmitResult(_.cloneDeep(initDate.submitResult));};return (<div className="w-auto"><div className={cn('flex flex-col gap-2', { 'opacity-50': isPending })}><div><label>昵称:</label><input name="uname" value={formData.uname} onChange={(e) => setFormData({ ...formData, uname: e.target.value })} className="border rounded px-2" /></div><div><label>评论:</label><input name="comment" value={formData.comment} onChange={(e) => setFormData({ ...formData, comment: e.target.value })} className="border rounded px-2" /></div><div className="flex gap-2"><button className="bg-blue-400 text-white px-2 rounded w-20 p-1" onClick={handleSubmit}>发表</button><button className="bg-red-400 text-white px-2 rounded w-20 p-1" onClick={handleReset}>重置</button></div></div><hr className="my-2" />{match(isPending).with(true, () => <span className="text-yellow-400 text-xs">提交中...</span>).otherwise(() =>match(submitResult.type).with('error', () => <span className="text-red-400 text-xs">{submitResult.data}</span>).with('success', () => <span className="text-green-400 text-xs">{submitResult.data}</span>).otherwise(() => null),)}</div>);
}
http://www.rkmt.cn/news/48411.html

相关文章:

  • 2025 年 11 月靶材厂家推荐排行榜,溅射/磁控溅射/旋转靶材,ITO/半导体/光学镀膜,陶瓷/金属/钛/铝/铜/钨/钼/钽/硅/合金/稀土靶材公司推荐
  • 2025 年 11 月滚珠花键厂家推荐排行榜,圆筒形滚珠花键,法兰型滚珠花键,新型滚珠花键公司推荐,专业选型与高效传动解决方案
  • MyEMS:数据驱动的全生命周期能源管控系统,开启智能赋能双碳新时代
  • 2025年AI数字人获客公司权威推荐榜单:AI公域获客/AI矩阵获客/AI全域获客源头公司精选
  • 模式识别与机器学习课程笔记(3):统计决策中的经典学习手段
  • linux 云主机 pip 安装配置 letsencrypt certbot 为多个域名生成免费 https 证书实录 - Leone
  • 示波器测电流:正、负峰值之差≠电流大小
  • 类私有属性
  • 2025年市面上最佳商标注册服务商Top 5排名与深度评测
  • Solon Web 的“分身术”:单应用多端口监听,化身多重服务
  • 2025-11-12 PQ v.Next日志记录
  • 如何在WPF中实现ComboBox多选 - 教程
  • 详细介绍:SQL Server 2019实验 │ 管理SQL Server的安全性
  • 都在转型,我们能做什么?
  • Java Map
  • 抗体人源化技术:治疗性抗体的迭代升级与临床突破
  • Zabbix 配置中文界面、监控告警以及Windows、Linux主/被监控模板
  • 【日记】这个健身器材是真要命了(934 字)
  • 记一次 .NET 某理财管理客户端 OOM溢出分析
  • P14400 [JOISC 2016] 回转寿司 / Sushi
  • 灰度的openkruise rollout - Super
  • P6532 [COCI 2015/2016 #1] TOPOVI
  • 【每日一面】BOM 是什么
  • 喵喵喵 III
  • P6680 [CCO 2019] Marshmallow Molecules
  • ANT天线ESD防护
  • 2025短视频拍摄公司排名与推荐:3个核心标准帮你选对团队,避开无效投入
  • 助力企业构建 AI 原生应用,函数计算 FunctionAI 重塑模型服务与 Agent 全栈生态
  • 小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇数据库篇MySQLMSSQLOracle自动化方案
  • vue2 混同,封装公共方法 - 东方不败-