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

shadcn之表单

前言

shadcn表单相关的了解,可知道 shadcn 目前推出了3种方式来处理表单(毕竟shadcn只做ui,要想处理好完整表单就涉及到可控、校验等问题):react-hook-form、tanstack、useActionState
image

react-hook-form版本

'use client';// 导入表单验证库
import * as z from 'zod';
// 导入消息提示组件
import { toast } from 'sonner';
// 导入 UI 组件
import { Input } from '@repo/shadcn-comps/input';
import { Button } from '@repo/shadcn-comps/button';
import { Textarea } from '@repo/shadcn-comps/textarea';
import { Field, FieldError, FieldGroup, FieldLabel } from '@repo/shadcn-comps/field';
// 导入表单处理相关
import { zodResolver } from '@hookform/resolvers/zod';
import { Controller, useForm } from 'react-hook-form';// 定义表单验证规则
const formSchema = z.object({title: z.string().min(5, '标题至少需要5个字符。').max(32, '标题最多32个字符。'),description: z.string().min(10, '描述至少需要10个字符。').max(30, '描述最多30个字符。'),
});/*** 问题反馈表单组件* 使用 react-hook-form 进行表单管理,zod 进行表单验证*/
export default function BugReportForm() {// 初始化表单,配置验证器和默认值const form = useForm<z.infer<typeof formSchema>>({resolver: zodResolver(formSchema), // 使用 zod 验证器defaultValues: {title: '',description: '',},});// 表单提交处理函数function onSubmit(data: z.infer<typeof formSchema>) {toast.info(JSON.stringify(data, null, 2));}return (<div className="p-2 w-100">{/* 表单主体 */}<form id="form-rhf-demo" onSubmit={form.handleSubmit(onSubmit)}><FieldGroup>{/* title字段 - 使用 Controller 包装以集成 react-hook-form */}<Controllername="title"control={form.control}render={({ field, fieldState }) => (<Field data-invalid={fieldState.invalid}><FieldLabel htmlFor="form-rhf-demo-title">标题</FieldLabel><Input {...field} id="form-rhf-demo-title" aria-invalid={fieldState.invalid} placeholder="请输入" />{/* 显示验证错误信息 */}{fieldState.invalid && <FieldError errors={[fieldState.error]} />}</Field>)}/><Controllername="description"control={form.control}render={({ field, fieldState }) => (<Field data-invalid={fieldState.invalid}><FieldLabel htmlFor="form-rhf-demo-description">描述</FieldLabel><Textarea {...field} id="form-rhf-demo-description" placeholder="请输入" rows={6} className="min-h-24 resize-none" />{/* 显示验证错误信息 */}{fieldState.invalid && <FieldError errors={[fieldState.error]} />}</Field>)}/></FieldGroup></form>{/* 操作按钮组 */}<Field orientation="horizontal" className="mt-2"><Button type="button" variant="outline" onClick={() => form.reset()}>重置</Button><Button type="submit" form="form-rhf-demo">提交</Button></Field></div>);
}
http://www.gsyq.cn/news/45941.html

相关文章:

  • 光学神经网络
  • 2025 年 11 月疥螨阴虱药剂厂家推荐排行榜,扑灭司林,苯甲酸苄酯,胺氯菊百灭宁,科灭达专业配方高效灭杀方案公司推荐
  • Day17内容溢出overflow属性
  • 谷歌广告生态指南:AdSense/GAM 接入避坑 + 填充监听 + 问题排查
  • 2025 年 11 月流量计厂家推荐排行榜,热式/模拟式/数字式/高压/高温/耐腐蚀/多气体/4-20mA/RS485/分体式/不锈钢/高精度流量计公司推荐
  • 2025 年 11 月聚氨酯厂家推荐排行榜,浇注型聚氨酯,聚氨酯预聚体,聚氨酯胶黏剂,聚氨酯组合料,聚氨酯密封,聚氨酯轮,聚氨酯胶辊,聚氨酯制品公司推荐
  • 2025 年 11 月氢氧化镁厂家推荐排行榜,矿石氢氧化镁,矿石法氢氧化镁,水镁石氢氧化镁,阻燃剂氢氧化镁,改性氢氧化镁公司推荐
  • 20232415 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • Day17清除默认样式
  • 2025 年 11 月磨粉机厂家推荐排行榜,雷蒙磨粉机,环辊磨粉机,摆式磨粉机,矿石磨粉机,超细磨粉机,高压磨粉机公司推荐
  • 详细介绍:探究微波消解仪如何创新现代实验室的样品前处理流程
  • 爆肝!Oracle RAC 日常运维命令总结
  • 详细介绍:线性代数 几何意义 | 基础、向量、行列式与线性方程组(上篇)
  • 在Zabbix中修改Web页面显示名称
  • 20232406 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 2025 年 11 月危险品运输厂家推荐排行榜,危险品运输车,危险品运输罐,危险品运输物流,危险品运输公司专业实力与安全服务深度解析
  • 对于生成虚tree进行DP——CF1097G Vladislav and a Great Legend
  • 使用napi-rs,通过node调用rust代码
  • 智语写作都有哪些功能?看这一篇就够了!智语写作全功能详解
  • rufus.ini
  • Explorer++
  • Interpretability-Guided Test-Time Adversarial Defense
  • 2025 年 11 月开窗器厂家推荐排行榜,链条开窗器,机芯开窗器,配件开窗器,电动开窗器公司推荐
  • noip5
  • #题解#洛谷P3143
  • 20232326 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 2025 ICPC成都+南京游记
  • MySQL表的增删改查 - 教程
  • 20232420 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • COLMO洗衣机维修24小时售后服务点电话号码