前端——HeroUI 知识点大全(三)

简介: 教程来源 https://www.bgnno.cn/ HeroUI表单系统基于React Aria,提供Form、Input、Select、NumberField等可组合组件,支持ARIA实时验证、服务端错误处理、虚拟化滚动、国际化格式化及前缀/后缀等高级功能,兼顾健壮性与开发体验。

三、表单系统:构建健壮的数据录入

3.1 表单组件架构
HeroUI 的表单系统构建在 React Aria Components 之上,提供了一系列可组合的表单组件 :

Form - 表单容器,处理提交和验证

Input / TextField - 文本输入

TextArea - 多行文本

Select / ComboBox - 下拉选择

Checkbox / RadioGroup - 选项选择

NumberField - 数字输入(带增减按钮)

FieldError - 错误信息展示

Description - 辅助说明文字

3.2 Form 组件详解
基础用法

import { Form, Input, Button, FieldError } from "@heroui/react";

export default function SignupForm() {
  return (
    <Form
      action="/api/signup"  // 传统表单提交 URL
      method="post"
      validationBehavior="aria"  // ARIA 验证(实时错误,不阻止提交)
      className="space-y-4 max-w-md"
    >
      <Input
        isRequired
        label="邮箱"
        name="email"
        type="email"
        description="我们将发送验证邮件到此地址"
      />

      <Input
        isRequired
        label="密码"
        name="password"
        type="password"
        minLength={8}
        description="至少 8 个字符"
      />
      <FieldError name="password" />

      <Button type="submit" color="primary">
        注册
      </Button>
    </Form>
  );
}

两种验证模式的对比
image.png
自定义验证函数

<Input
  label="用户名"
  name="username"
  validate={(value) => {
    if (value.length < 3) {
      return "用户名至少需要 3 个字符";
    }
    if (!/^[a-zA-Z0-9]+$/.test(value)) {
      return "只能包含字母和数字";
    }
    return null;  // 返回 null 表示验证通过
  }}
/>

服务器端验证错误

const [serverErrors, setServerErrors] = useState({});

const handleSubmit = async (e: FormEvent) => {
  e.preventDefault();
  const formData = new FormData(e.currentTarget);
  const res = await fetch("/api/register", { method: "POST", body: formData });

  if (!res.ok) {
    const errors = await res.json();
    setServerErrors(errors);  // { email: "邮箱已被注册", username: "用户名已存在" }
  }
};

return (
  <Form validationErrors={serverErrors} onSubmit={handleSubmit}>
    {/* 表单内容 */}
  </Form>
);

当用户修改对应字段时,validationErrors 中的错误会自动清除。

3.3 Input 组件的进阶功能
前缀与后缀

<Input
  label="金额"
  startContent={<span className="text-default-400">¥</span>}
  endContent={<span className="text-default-400">.00</span>}
/>

输入组(InputGroup)
从 v3.0.0-beta.2 开始,HeroUI 提供了 InputGroup 组件,用于将多个输入控件组合在一起 :

import { InputGroup, Input } from "@heroui/react";

<InputGroup>
  <Input placeholder="区号" className="w-24" />
  <Input placeholder="电话号码" />
</InputGroup>

TextArea

<Input
  as="textarea"
  label="个人简介"
  minRows={3}
  maxRows={6}
  description="简短介绍一下自己"
/>

3.4 Select 组件
基础用法

import { Select, SelectItem } from "@heroui/react";

const animals = [
  { key: "cat", label: "猫" },
  { key: "dog", label: "狗" },
  { key: "bird", label: "鸟" },
];

<Select label="选择宠物" items={animals}>
  {(animal) => <SelectItem key={animal.key}>{animal.label}</SelectItem>}
</Select>

Select 的 API 变化(v3.0.0-beta.2)
⚠️ 重要变更:Select.Content 子组件已重命名为 Select.Popover,以保持与其他组件(如 ComboBox、Dropdown)的一致性 。

// ❌ v3.0.0-beta.2 之前
<Select.Content>...</Select.Content>

// ✅ v3.0.0-beta.2 及以后
<Select.Popover>...</Select.Popover>

虚拟化滚动(大数据量优化)

<Select
  label="大数据量选项"
  items={largeDataset}  // 假设有 5000 条数据
  isVirtualized  // 开启虚拟化
  virtualizedItemSize={48}  // 每项高度 48px
/>

开启 isVirtualized 后,Select 内部使用 @tanstack/react-virtual,仅渲染可视区域内的选项,大幅提升性能。

3.5 NumberField 组件
从 v3.0.0-beta.2 引入 :

import { NumberField } from "@heroui/react";

<NumberField
  label="数量"
  defaultValue={1}
  minValue={1}
  maxValue={99}
  step={1}
  formatOptions={
  { style: "decimal" }}
/>

国际化支持:formatOptions 基于 Intl.NumberFormat,支持货币、百分比、小数位数等格式化。
来源:
https://bgnno.cn/

相关文章
|
安全 IDE Java
使用Spring Initailizr功能~
使用Spring Initailizr功能~
746 1
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
7月前
|
负载均衡 算法 Java
微服务篇
本文详解SpringBoot自动装配原理、启动流程、核心注解@SpringBootApplication组成,以及SpringCloud微服务中注册发现、负载均衡、限流熔断、服务降级等实现方案,涵盖常用起步依赖、配置管理、跨域处理及项目实战配置。
|
存储 数据可视化 知识图谱
高效知识管理的五大方法,助力写作更上一层楼
在信息爆炸的时代,高效的知识管理是提升写作效率与质量的关键。本文探讨如何通过系统化的知识获取、分类存储、动态更新和高效检索,构建个人知识体系,并介绍智能化工具如看板的应用,帮助写作者整合信息、激发灵感、优化流程,实现从输入到输出的闭环,持续提升创作能力。
455 14
高效知识管理的五大方法,助力写作更上一层楼
|
JSON 前端开发 数据可视化
前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学。Layui 是一款开源前端 UI 组件库,具有极简设计、强大功能和卓越性能,支持布局、表单、表格、弹层等六大模块,组件高度可定制。它无需复杂构建工具,直接面向浏览器开发,极大提升开发效率与界面美观度。适合新手和老手,快来试试吧!
888 0
|
人工智能 搜索推荐 vr&ar
让教育更智能:HarmonyOS助力AI类目标签革新教育行业
在科技飞速发展的当下,教育行业正经历深刻变革,智能化转型成为提升教育质量与效率的关键。AI类目标签技术脱颖而出,通过分析学生多维度数据生成个性化学习标签,助力因材施教;智能管理教学资源,提高备课效率。HarmonyOS NEXT API 12及以上版本的分布式能力和强大的数据安全机制,为多设备协同学习和数据保护提供了有力支持。开发者可利用鸿蒙生态构建创新教育应用,推动教育智能化发展。
492 2
|
安全 监控 网络安全
HW蓝队面试题精选
该内容是关于网络安全面试的题型,涵盖了网络安全的多个重要方面。
708 4
|
开发工具 git Windows
IDEA如何对比不同分支某个文件的差异
【9月更文挑战第28天】该指南介绍了在IDEA中使用Git工具窗口进行分支对比的方法。首先,通过底部工具栏或菜单打开Git窗口;接着,在“Branches”选项卡中查看所有分支;然后选择要对比的分支和文件,并通过右键菜单启动对比;最后,在“Diff”视图中查看详细差异,包括新增和删除内容的颜色标记。此外,还提供了使用内置终端执行`git diff`命令进行对比的可选方法。
4208 4
|
自然语言处理 IDE JavaScript
Fitten Code
【8月更文挑战第30天】
1095 4