发布时间:2026/9/3 5:22:27
HarmonyOS 校园应用系列之ArkTS 表单工程:打印文件创建页的受控组件与分组卡片实践 HarmonyOS 校园应用系列之ArkTS 表单工程打印文件创建页的受控组件与分组卡片实践一、页面定位与功能概述文件创建页Func1Tab是校园打印 App 的数据录入中心——用户在此创建打印任务填写标题、描述、选择打印类型和优先级。页面标题为创建副标题填写信息快速创建明确了单一职责。本页是纯粹的数据录入型页面——包含 TextInput、TextArea、Toggle 等多种受控表单组件是学习 ArkUI 表单开发的最佳实战案例。页面采用Section 分组卡片布局每个功能区用白色圆角卡片包裹卡片间距 14vpColumn({ space: 14 })。1.1 页面状态定义State inputTitle: string // 文档标题 State inputDesc: string // 详细描述 State selectedType: number 0 // 选中的类型索引 State selectedPriority: number 1 // 优先级0低, 1中, 2高 State remindOn: boolean true // 提醒通知开关5 个State变量覆盖所有输入维度。selectedType和selectedPriority使用 number 类型作为数组索引比 string 类型更语义化。项目源码开源https://gitee.com/codenestFlow/HarmonyOSHub二、页面头部 —— 标题 操作按钮Builder Header() { Row({ space: 12 }) { Column({ space: 2 }) { Text(创建).fontSize(20).fontWeight(FontWeight.Bold).fontColor(C.text) Text(填写信息快速创建).fontSize(10).fontColor(C.textDim) }.alignItems(HorizontalAlign.Start) Blank() Row() { Text().fontSize(18) } .width(36).height(36).backgroundColor(C.cardSoft).borderRadius(D.rSm).justifyContent(FlexAlign.Center) } .width(100%).height(this.safeTop 60) .padding({ top: this.safeTop, left: D.pad, right: D.pad }) .backgroundColor(C.card).alignItems(VerticalAlign.Bottom) .border({ width: { bottom: 1 }, color: C.stroke }) }头部是主标题副标题双行结构左侧 20vp 加粗创建与 10vp 灰色副标题填写信息快速创建纵向排列明确页面单一职责。右侧是 emoji 图标放在C.cardSoft底、D.rSm圆角的 36×36 方块中暗示可从剪贴板粘贴文档信息这是降低输入成本的典型策略。头部高度safeTop 60配合alignItems(VerticalAlign.Bottom)让内容沉底对齐底部 1vpC.stroke分隔线与白底C.card构成通栏吸顶效果。三、FormCard —— 基本信息录入区Builder FormCard() { Column({ space: 12 }) { Row() { Text(基本信息).fontSize(15).fontWeight(FontWeight.Bold).fontColor(C.text) Blank() Text(✕).fontSize(16).fontColor(C.textDim) }.width(100%) Column({ space: 6 }) { Text(标题).fontSize(12).fontColor(C.textSub) TextInput({ placeholder: 请输入标题, text: this.inputTitle }) .onChange((v: string) { this.inputTitle v; }) .height(44).backgroundColor(C.cardSoft).borderRadius(D.rSm).placeholderColor(C.textDim) }.alignItems(HorizontalAlign.Start).width(100%) Column({ space: 6 }) { Text(描述).fontSize(12).fontColor(C.textSub) TextArea({ placeholder: 请输入详细描述..., text: this.inputDesc }) .onChange((v: string) { this.inputDesc v; }) .height(90).backgroundColor(C.cardSoft).borderRadius(D.rSm).placeholderColor(C.textDim) }.alignItems(HorizontalAlign.Start).width(100%) Row({ space: 8 }) { Text( 图片).fontSize(12).fontColor(C.textSub) .padding({ left: 10, right: 10, top: 6, bottom: 6 }) .backgroundColor(C.cardSoft).borderRadius(D.rSm) Text( 链接).fontSize(12).fontColor(C.textSub) .padding({ left: 10, right: 10, top: 6, bottom: 6 }) .backgroundColor(C.cardSoft).borderRadius(D.rSm) Blank() Text(${this.inputTitle.length}/50).fontSize(10).fontColor(C.textDim) }.width(100%) } .width(100%).padding(14).backgroundColor(C.card).borderRadius(D.rMd) .border({ width: 1, color: C.stroke }) }3.1 TextInput vs TextArea 对比特性TextInputTextArea适用场景单行短文本标题多行长文本描述默认行为Enter 不换行Enter 换行高度固定 44vp固定 90vp两者共享相同样式体系D.rSm圆角 10vp、C.cardSoft浅灰背景保持视觉一致性。3.2 受控组件双向绑定模式TextInput({ placeholder: 请输入标题, text: this.inputTitle }) // ① 外部传入当前值 .onChange((v: string) { // ② 用户输入时回调 this.inputTitle v // ③ 更新状态变量触发重渲染 })这是 ArkUI 标准的受控组件模式—— UI 显示完全由状态决定不存在显示值和存储值不一致的问题。在表单校验、重置、回填场景中尤为关键。3.3 实时字数统计${this.inputTitle.length}/50展示标题输入框的实时字数——即时反馈让用户每输入一个字符就看到变化分母 50 隐式传达上限。接近或超限时可将数字变为橙色/红色警告。3.4 附件按钮设计图片和链接按钮使用emoji 图标文字色块组合 图片、 链接浅灰背景C.cardSoft像可点击的标签Tag Button比纯文字或纯图标更醒目。四、TypeCard —— 图标化四选一类型选择器Builder TypeCard() { Column({ space: 12 }) { Text(选择类型).fontSize(15).fontWeight(FontWeight.Bold).fontColor(C.text).width(100%) Row() { ForEach(this.types, (item: OptionItem, idx: number) { Column({ space: 6 }) { Row() { Text(item.icon).fontSize(24) } .width(48).height(48).borderRadius(D.rMd).justifyContent(FlexAlign.Center) .backgroundColor(this.selectedType idx ? C.primarySoft : C.cardSoft) .border({ width: this.selectedType idx ? 2 : 0, color: C.primary }) Text(item.name).fontSize(10) .fontColor(this.selectedType idx ? C.primary : C.textDim) .fontWeight(this.selectedType idx ? FontWeight.Bold : FontWeight.Normal) }.layoutWeight(1) .onClick(() { this.selectedType idx; }) }, (item: OptionItem) item.name) }.width(100%) } .width(100%).padding(14).backgroundColor(C.card).borderRadius(D.rMd) .border({ width: 1, color: C.stroke }) }4.1 选中态的四重同步变化选中某类型时同时发生4 个视觉属性变化属性未选中选中图标背景色浅灰C.cardSoft浅绿C.primarySoft色块强调图标边框0vp2vp 绿色描边文字颜色灰C.textDim绿C.primary文字高亮文字字重NormalBold加粗强化图标是 emojiText 类型一 / 类型二 / ⭐ 类型三 / 类型四放在 48×48、D.rMd圆角的方块中。多重信号叠加的效果远超单一属性切换——即使不看文字仅凭色块边框就能识别选中项。4.2 为什么不用 Radio 组件标准 Radio 只能显示圆形选择器无法展示业务图标需要横向一行四列排列而非垂直列表选中态需要使用主题绿色。当标准组件无法满足需求时用基础组件组合自定义是合理的选择。五、PriorityCard —— 三档优先级Builder PriorityCard() { Column({ space: 12 }) { Row() { Text(优先级).fontSize(15).fontWeight(FontWeight.Bold).fontColor(C.text) Blank() Text(this.priorities[this.selectedPriority]).fontSize(13).fontColor(C.primary).fontWeight(FontWeight.Bold) }.width(100%) Row({ space: 6 }) { ForEach(this.priorities, (p: string, idx: number) { Text(p).fontSize(13) .fontColor(this.selectedPriority idx ? #FFFFFF : C.textSub) .backgroundColor(this.selectedPriority idx ? (idx 2 ? C.danger : idx 1 ? C.warn : C.ok) : C.cardSoft) .borderRadius(D.rSm).padding({ left: 16, right: 16, top: 8, bottom: 8 }) .onClick(() { this.selectedPriority idx; }) }, (p: string) p) }.width(100%) } .width(100%).padding(14).backgroundColor(C.card).borderRadius(D.rMd) .border({ width: 1, color: C.stroke }) }5.1 当前值回显卡片标题行右侧用Text(this.priorities[this.selectedPriority])实时回显当前选中的优先级绿色加粗用户无需扫视下方按钮即可确认当前状态。5.2 交通灯色彩语义优先级色值含义低C.ok#2BB673绿色冷静、不紧急中C.warn#FF9F1C琥珀注意、默认推荐高C.danger#FF5A6E红色紧急、立即关注选中项填充对应语义色 白字未选中项统一为C.cardSoft浅灰底 C.textSub灰字。默认值selectedPriority 1即中档大多数用户会接受默认选项以减少决策成本。六、SettingCard —— Toggle 开关与设置项Builder SettingCard() { Column({ space: 0 }) { Row({ space: 12 }) { Row() { Text().fontSize(16) } .width(32).height(32).backgroundColor(C.cardSoft).borderRadius(D.rSm).justifyContent(FlexAlign.Center) Column({ space: 2 }) { Text(提醒通知).fontSize(14).fontColor(C.text) Text(开启后将推送提醒).fontSize(11).fontColor(C.textDim) }.alignItems(HorizontalAlign.Start).layoutWeight(1) Toggle({ type: ToggleType.Switch, isOn: this.remindOn }) .selectedColor(C.primary) .onChange((on: boolean) { this.remindOn on; }) }.width(100%).padding({ top: 12, bottom: 12 }) Divider().color(C.stroke) Row({ space: 12 }) { Row() { Text().fontSize(16) } .width(32).height(32).backgroundColor(C.cardSoft).borderRadius(D.rSm).justifyContent(FlexAlign.Center) Column({ space: 2 }) { Text(隐私设置).fontSize(14).fontColor(C.text) Text(仅自己可见).fontSize(11).fontColor(C.textDim) }.alignItems(HorizontalAlign.Start).layoutWeight(1) Text(›).fontSize(22).fontColor(C.textDim) }.width(100%).padding({ top: 12, bottom: 12 }) } .width(100%).padding({ left: 14, right: 14 }).backgroundColor(C.card).borderRadius(D.rMd) .border({ width: 1, color: C.stroke }) }提醒开关使用系统Toggle组件ToggleType.Switch滑动开关isOn绑定remindOn状态.selectedColor(C.primary)让开启态轨道为主题绿。图标是 emojiText()放在 32×32 浅灰方块中。卡片下半部分是隐私设置跳转项 图标 ›箭头中间用Divider().color(C.stroke)分隔——开关项与跳转项合并在同一张卡片是设置页的经典分组手法。HarmonyOS 提供三种 Toggle 类型SwitchiOS 风格滑动开关、Checkbox复选框、Button独立切换按钮。开/关二态用 Toggle 更直观多选用 Checkbox 更语义准确。提醒通知明显是二态开关。七、TemplateCard 与 SubmitBtn —— 快捷模板与提交按钮Builder TemplateCard() { Column({ space: 10 }) { Text(快捷模板).fontSize(15).fontWeight(FontWeight.Bold).fontColor(C.text).width(100%) ForEach(this.templates, (item: QuickTemplate) { Row({ space: 10 }) { Row() { Text().fontSize(18) } .width(32).height(32).backgroundColor(C.primarySoft).borderRadius(D.rSm).justifyContent(FlexAlign.Center) Column({ space: 2 }) { Text(item.title).fontSize(13).fontWeight(FontWeight.Medium).fontColor(C.text) Text(item.desc).fontSize(10).fontColor(C.textDim) }.alignItems(HorizontalAlign.Start).layoutWeight(1) Text(›).fontSize(18).fontColor(C.textDim) }.width(100%) .onClick(() { promptAction.showToast({ message: item.title }); }) }, (item: QuickTemplate) item.title) } .width(100%).padding(14).backgroundColor(C.card).borderRadius(D.rMd) .border({ width: 1, color: C.stroke }) } Builder SubmitBtn() { Column({ space: 8 }) { Button(this.inputTitle.length 0 ? ✓ 提交创建 : 请填写标题) .width(100%).height(48) .backgroundColor(this.inputTitle.length 0 ? C.primary : C.cardSoft).fontColor(#FFFFFF) .fontSize(16).fontWeight(FontWeight.Bold).borderRadius(D.rMd) .onClick(() { if (this.inputTitle.length 0) { promptAction.showToast({ message: 请输入标题 }); return; } promptAction.showToast({ message: 创建成功 }); this.inputTitle ; this.inputDesc ; }) Text(提交即表示同意相关条款).fontSize(9).fontColor(C.textDim).width(100%).textAlign(TextAlign.Center) }.width(100%) }快捷模板提供三个预设快速创建/高级模式/批量导入点击弹出 toast。提交按钮是状态自适应按钮标题为空时显示请填写标题C.cardSoft灰底有输入时变为✓ 提交创建C.primary绿底——按钮文案与背景色随inputTitle.length联动无需额外校验提示。点击时若标题为空弹 toast 请输入标题并 return成功则弹创建成功并清空inputTitle、inputDesc两个状态完成表单重置。按钮下方 9vp 灰字提交即表示同意相关条款是合规提示。八、表单设计六大最佳实践视觉分组每个功能区用独立白色圆角卡片包裹降低认知负荷渐进式 disclosure核心信息 → 分类 → 优先级 → 辅助设置 → 模板 → 提交符合自然思维流程即时反馈字数实时更新、选中态即时切换、Toggle 即时响应、按钮文案随输入变化合理默认值类型默认第一项、优先级默认中、提醒默认开启清晰标签体系输入字段上方小号灰色标签 placeholder 补充上下文操作引导快捷模板降低输入成本、提交按钮文案引导补全标题九、表单校验与提交流程源码中的提交校验逻辑非常轻量——只校验标题.onClick(() { if (this.inputTitle.length 0) { promptAction.showToast({ message: 请输入标题 }); return; } promptAction.showToast({ message: 创建成功 }); this.inputTitle ; this.inputDesc ; })若要扩展为完整的生产级流程可在此基础上增加四步// 第一步前端校验 const canSubmit this.inputTitle.trim().length 0 this.inputDesc.trim().length 0; if (!canSubmit) { showToast(请填写完整信息); return; } // 第二步数据组装 const payload { title: this.inputTitle, content: this.inputDesc, type: this.types[this.selectedType].name, priority: [低,中,高][this.selectedPriority], reminder: this.remindOn }; // 第三步异步请求http 模块 POST // 第四步状态重置或路由跳转十、键盘适配方案真机上键盘弹出可能遮挡输入框。三种解决方案.expandSafeArea([SafeAreaType.KEYBOARD])— 自动避让Scroll 包裹输入区域推荐本页已采用— 最简单框架自动处理监听window.on(keyboardHeightChange)动态调整 padding本页主内容区已经包裹在Scroll中.layoutWeight(1).scrollBar(BarState.Off).align(Alignment.Top)键盘弹出时用户可滚动定位被遮挡的输入框。十一、总结文件创建页展示了 ArkUI 表单开发的完整模式Section 卡片分组布局保持视觉清晰受控组件双向绑定确保数据一致性图标化选择器提供超越标准组件的表现力状态自适应提交按钮引导用户补全关键信息。这些模式可直接复用到任何需要数据录入的场景。

相关新闻

2026/9/3 5:22:27

STM32+ESP8266+Android数据传输链路排错指南

简介:本资源是一套面向嵌入式与物联网开发初学者及进阶者的完整通信系统例程,聚焦STM32单片机通过ESP8266 WiFi模块与Android APP实现双向TCP数据传输的实际工程实践。适用于智能家居、远程传感器监控、IoT设备控制等典型应用场景,帮助开发者…

2026/9/3 5:22:27

Python爬虫自学教程:从零基础到实战就业全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 5:22:27

我删掉了自己写的 300 行 Future,把整个 RPC 框架改成全链异步

Jaws 系列第 6 篇。前情提要:《删掉 gRPC 依赖后,我用 2400 行打通了 gRPC 生态》、《HTTP/2 传输进化史》。 本文代码全部出自 javahongxi/jaws,commit 可查。 一、一个让人不舒服的 join() 故事要从 wire 模块的一次重构说起。 8 月底我给…

2026/9/3 5:27:27

Python实现6S大气校正:遥感影像自动化处理与多卫星支持

简介:本资源是面向遥感科研与工程应用开发者的6S大气校正Python实现工具包,专为解决GF-1/2、Landsat-8、Sentinel-2等主流卫星影像的大气影响去除问题而设计,适用于地表反射率反演、植被指数计算、水体识别等定量遥感分析场景,兼顾…

2026/9/3 5:27:27

线性调频Chirp信号工程落地:从数学公式到嵌入式实现

简介:本资源是一份面向通信工程专业学生与初阶信号处理实践者的MATLAB教学脚本,聚焦Chirp调制原理及其在扩频BOK(Binary Offset Keying)中的实现与验证。资源解决的核心问题是:如何在MATLAB中从零构建Chirp信号、完成相…

2026/9/3 5:27:27

基于分形理论的粗糙表面接触刚度MATLAB计算与工程应用

简介:本资源是一套面向机械工程、材料科学及接触力学研究者的MATLAB计算工具,聚焦于粗糙表面法向接触刚度的分形理论建模与数值求解,解决传统平滑表面假设在微纳尺度接触分析中的局限性问题。压缩包为RAR格式,共含2个MATLAB脚本文…

2026/9/3 5:27:27

C语言贪吃蛇实战手记:链表+状态机实现高分期末作业

简介:本资源是一份高质量的C语言期末大作业项目——贪吃蛇大作战完整源码包,面向计算机相关专业本科生及C语言初学者,解决课程设计、期末考核中缺乏可运行、可展示、可讲解的综合性实践项目问题。压缩包共29个文件,包含核心源码文…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…