当前位置: 首页 > 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.jsqmd.com/news/39278/

相关文章:

  • 2025年拆迁补偿安置口碑推荐榜单:十大专业律所综合评测
  • jenkins构建序号自定义显示
  • 2025 年 11 月连接器厂家推荐排行榜,圆形/M12/M8/防水/水密/重载/传感器/工业/RJ45/以太网连接器公司精选
  • 2025年石岛红光板源头厂家综合评测:石岛红石材/中国黑石材/五莲灰石材源头厂家精选
  • 2025 年 11 月滚珠花键厂家推荐排行榜:圆筒形滚珠花键,法兰型滚珠花键,新型滚珠花键公司推荐
  • 2FSK 调制指数 、相关系数 、 频谱特性
  • 2025 年 11 月靶材厂家推荐排行榜,溅射/磁控溅射/旋转靶材,ITO/半导体/光学镀膜,陶瓷/金属/钛/铝/铜/钨/钼/钽/硅/合金/稀土靶材公司推荐
  • 2、JDBC快速入门
  • 2025 年 11 月高考文化课集训/艺考文化课集训机构推荐排行榜,全日制集训,封闭式管理,重点高中师资,冲刺提分保障!
  • 2025 年 11 月滚珠花键厂家推荐排行榜,圆筒形滚珠花键,法兰型滚珠花键,新型滚珠花键公司推荐,专业选型与高效传动解决方案
  • Qwen Code CLI - Windows 使用
  • [电调]AM32电调调参系列 —— Motor KV参数分析
  • 【Android】【面试】Handler/Looper 相关的知识点和面试常见问题 - 指南
  • 2025年AI数字人获客公司权威推荐榜单:AI公域获客/AI矩阵获客/AI全域获客源头公司精选
  • 模式识别与机器学习课程笔记(3):统计决策中的经典学习手段
  • 11/13
  • 剪映高级感口播字幕预设220M850款轻量合集,拖拽生成商业级动态文字(Win_Mac通用)
  • linux 云主机 pip 安装配置 letsencrypt certbot 为多个域名生成免费 https 证书实录 - Leone
  • 手动清除Ubuntu系统中的内存缓存的步骤
  • VMware ESXi 8.0U3g 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版
  • VMware ESXi 9.0.1.0 集成 RTL8111 / RTL8125 / RTL8126 / RTL8127 网卡驱动定制版
  • 2025年市面上最佳商标注册服务商Top 5排名与深度评测
  • 2025年商标注册服务商综合评测:五大权威机构深度解析
  • 基于微信小应用的垃圾分类管理系统【2026最新】
  • 2025-11-12 PQ v.Next日志记录
  • 完整教程:人体心率测量技术
  • 如何在WPF中实现ComboBox多选 - 教程
  • 内江低噪音西林瓶灌装轧盖机选型,适配洁净车间
  • week3task
  • trick 选记