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

HarmonyOS6 ArkTS Search组件使用文档

文章目录

    • 完整代码
    • 核心API
      • 1 组件构造参数
      • 2 核心控制器:SearchController
      • 3 主要属性分类详解
        • 3.1 基础样式属性
        • 3.2 图标与按钮属性
        • 3.3 文字样式属性
        • 3.4 光标与选中文本属性
        • 3.5 输入控制属性
        • 3.6 高级文本样式属性
        • 3.7 键盘与菜单扩展属性
      • 4 全部事件监听
      • 5 自定义扩展能力
        • 5.1 自定义键盘
        • 5.2 自定义编辑菜单
    • 常用功能使用示例
      • 1 基础搜索功能实现
      • 2 光标与选区控制
      • 3 输入内容过滤
      • 4 输入/删除拦截

Search是 HarmonyOS6 提供的搜索输入组件,基于 ArkTS 开发,适配 API 11+ 版本,集成了文本输入、搜索触发、光标控制、选区操作、自定义交互等一站式搜索能力。该组件可灵活配置样式、图标、按钮及输入规则,支持自定义键盘和编辑菜单,满足应用内全局搜索、页面局部搜索、条件筛选等各类搜索场景需求,是鸿蒙应用开发中实现搜索功能的核心基础组件。

完整代码

@Entry @Component struct SearchFullDemo { // 基础状态 @State searchValue: string = ''; @State submitValue: string = ''; @State cursorIndex: number = 0; // 自定义键盘 controller: SearchController = new SearchController(); build() { Column({ space: 12 }) { // 标题 Text('Search 官方全部示例整合版') .fontSize(22) .fontWeight(FontWeight.Bold) .margin({ top: 20 }); // 实时显示 Text('搜索内容:' + this.searchValue) .fontSize(16) .width('90%'); Text('提交内容:' + this.submitValue) .fontSize(16) .width('90%'); // ====================== 搜索框(整合所有属性) ====================== Search({ value: this.searchValue, placeholder: '请输入搜索内容', controller: this.controller }) // 基础样式 .width('90%') .height(50) .backgroundColor('#F5F5F5') .borderRadius(25) .padding({ left: 15, right: 15 }) // 图标与按钮 .searchIcon({ size: 20, color: '#666' }) .cancelButton({ style: CancelButtonStyle.CONSTANT, icon: { size: 18 } }) .searchButton('搜索', { fontColor: '#007DFF', fontSize: 16 }) // 文字样式 .placeholderColor('#999') .placeholderFont({ size: 15, weight: FontWeight.Normal }) .textFont({ size: 16, weight: FontWeight.Medium }) .fontColor('#333') // 光标与选中 .caretStyle({ width: 2, color: '#007DFF' }) .selectedBackgroundColor('#a0c8ff') // 输入控制 .maxLength(20) .type(SearchType.NORMAL) .enterKeyType(EnterKeyType.Search) .enablePreviewText(true) .enableHapticFeedback(true) .copyOption(CopyOptions.LocalDevice) .inputFilter('[a-zA-Z0-9\u4e00-\u9fa5\\s]*') .textAlign(TextAlign.Start) // 高级文本样式 .lineHeight(24) .letterSpacing(0.5) .decoration({ type: TextDecorationType.None }) .minFontSize(12) .maxFontSize(18) .halfLeading(true) .enableAutoSpacing(false) // 键盘与菜单 .enableKeyboardOnFocus(true) .selectionMenuHidden(false) .stopBackPress(true) .customKeyboard(this.CustomKeyboard()) .editMenuOptions(this.CustomEditMenu()) // ====================== 全部事件 ====================== .onChange((value) => { this.searchValue = value; }) .onSubmit((value) => { this.submitValue = value; this.controller.stopEditing(); }) .onEditChange((isEditing) => { console.info('编辑状态:', isEditing); }) .onTextSelectionChange((start, end) => { this.cursorIndex = start; }) .onCopy((value) => console.info('复制:', value)) .onCut((value) => console.info('剪切:', value)) .onPaste(() => console.info('粘贴')) .onWillInsert((value) => { console.info('将要插入:', value.insertValue); return true; }) .onDidInsert((value) => console.info('插入完成:', value.insertValue)) .onWillDelete((value) => { console.info('将要删除:', value.deleteValue); return true; }) .onDidDelete((value) => console.info('删除完成:', value.deleteOffset)) .onContentScroll((x, y) => console.info('滚动:', x, y)) // ====================== 功能按钮 ====================== Row({ space: 10 }) { Button('光标移到末尾') .onClick(() => { this.controller.caretPosition(this.searchValue.length); }); Button('选中前3位') .onClick(() => { this.controller.setTextSelection(0, 3); }); Button('关闭键盘') .onClick(() => { this.controller.stopEditing(); }); } .width('90%') .justifyContent(FlexAlign.Center); } .width('100%') .backgroundColor('#fff') .padding({ bottom: 30 }); } // ====================== 自定义键盘(示例3) ====================== @Builder CustomKeyboard() { Column() { Row() { Button('关闭键盘') .onClick(() => { this.controller.stopEditing(); }) .margin({ bottom: 10 }); } Grid() { ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], (item: number) => { GridItem() { Button(item.toString()) .width(80) .height(40) .onClick(() => { this.searchValue += item; }); } }); } .maxCount(3) .columnsGap(6) .rowsGap(6) .padding(10); } .backgroundColor('#eee'); } // ====================== 自定义菜单(示例10) ====================== CustomEditMenu(): EditMenuOptions { return { onCreateMenu: (menuItems: Array<TextMenuItem>) => { menuItems.push({ content: '我的菜单', id: TextMenuItemId.of('custom') }); return menuItems; }, onMenuItemClick: (item: TextMenuItem) => { console.info('点击菜单:', item.content); return true; } }; } }

运行效果如图:

核心API

1 组件构造参数

Search组件通过构造参数初始化核心绑定值和控制器,参数说明如下:

参数名类型必选作用
valuestring绑定搜索框输入文本,支持双向数据绑定
placeholderstring搜索框无内容时的占位提示文字
controllerSearchController搜索框控制器,用于控制光标、选区、键盘等操作

2 核心控制器:SearchController

通过new SearchController()创建,是操作Search组件的核心入口,提供以下关键方法:

方法名入参作用
caretPositionposition: number设置光标位置,入参为光标所在索引值
setTextSelectionstart: number, end: number选中指定范围文本,start为起始索引,end为结束索引
stopEditing结束编辑状态,收起软键盘

3 主要属性分类详解

3.1 基础样式属性

用于配置搜索框整体外观,包括尺寸、背景、圆角等,贴合鸿蒙UI设计规范:

属性作用示例
width/height设置搜索框宽高.width('90%').height(50)
backgroundColor设置搜索框背景色.backgroundColor('#F5F5F5')
borderRadius设置搜索框圆角.borderRadius(25)
padding设置搜索框内边距.padding({ left: 15, right: 15 })
3.2 图标与按钮属性

自定义搜索框内置的搜索图标、取消按钮、右侧搜索按钮,支持样式和显示规则配置:

属性作用关键配置项
searchIcon配置左侧搜索图标size(尺寸)、color(颜色)
cancelButton配置清除/取消按钮style(显示样式:CONSTANT/TRANSIENT)、icon(图标样式)
searchButton配置右侧搜索按钮第一个参数为按钮文字,第二个参数配置fontColor、fontSize
3.3 文字样式属性

分别配置占位符和输入文本的样式,支持精细化字体控制:

属性作用适用对象
placeholderColor/placeholderFont占位符颜色/字体(尺寸、字重)占位提示文字
fontColor/textFont输入文本颜色/字体(尺寸、字重)实际输入文字
textAlign文本对齐方式所有文字(Start/Center/End)
3.4 光标与选中文本属性

配置光标样式和选中文本的背景色,提升输入交互体验:

属性作用配置项
caretStyle光标样式width(宽度)、color(颜色)
selectedBackgroundColor选中文本背景色直接传入颜色值
3.5 输入控制属性

限制输入规则、配置输入行为,保障输入内容的合法性和交互一致性:

属性作用可选值/说明
maxLength最大输入长度正整数
type搜索框类型SearchType.NORMAL(普通)
enterKeyType回车键类型EnterKeyType.Search(搜索)/Go/Next等
inputFilter输入内容过滤正则表达式,示例:[a-zA-Z0-9\u4e00-\u9fa5\\s]*(仅允许中英文、数字、空格)
copyOption复制/剪切/粘贴权限CopyOptions.LocalDevice(本地设备)/None(禁止)/All(全部)
enablePreviewText是否开启输入预上屏true/false
3.6 高级文本样式属性

对输入文本进行精细化样式配置,支持排版优化:

属性作用
lineHeight设置文本行高
letterSpacing设置文字间距
decoration设置文本装饰线(下划线、删除线等)
minFontSize/maxFontSize设置文本字号自适应范围
halfLeading是否开启半行高间距
enableAutoSpacing是否开启中西文自动间距
3.7 键盘与菜单扩展属性

配置键盘拉起规则,绑定自定义键盘和自定义编辑菜单,实现个性化交互:

属性作用配置值
enableKeyboardOnFocus获焦时是否自动拉起键盘true/false
selectionMenuHidden是否隐藏系统默认选区菜单true/false
stopBackPress返回键是否仅收起键盘不销毁页面true/false
customKeyboard绑定自定义键盘传入@Builder装饰的自定义键盘构建方法
editMenuOptions绑定自定义编辑菜单传入EditMenuOptions类型的配置对象

4 全部事件监听

Search组件提供全生命周期的事件监听,覆盖输入、提交、编辑、操作等所有场景,支持事件拦截和回调处理:

事件名入参触发时机核心作用
onChangevalue: string搜索框文本发生变化时实时获取输入内容,更新绑定状态
onSubmitvalue: string点击搜索按钮/按下回车键时触发搜索逻辑,获取最终搜索内容
onEditChangeisEditing: boolean编辑状态切换时(获焦/失焦)监听搜索框是否处于编辑状态
onTextSelectionChangestart: number, end: number文本选区发生变化时获取当前选区的起始和结束索引
onCopyvalue: string执行复制操作时监听复制内容,可做日志记录
onCutvalue: string执行剪切操作时监听剪切内容,可做日志记录
onPaste执行粘贴操作时监听粘贴行为,可做内容校验
onWillInsertvalue: InsertValue文本即将插入到搜索框时输入拦截,return false则禁止插入
onDidInsertvalue: InsertValue文本插入到搜索框完成后监听插入完成事件,做后续处理
onWillDeletevalue: DeleteValue文本即将被删除时删除拦截,return false则禁止删除
onDidDeletevalue: DeleteValue文本删除完成后监听删除完成事件,做后续处理
onContentScrollx: number, y: number搜索框内容发生滚动时监听滚动偏移量,适配滚动布局

5 自定义扩展能力

5.1 自定义键盘

通过@Builder装饰器构建自定义键盘布局,替代系统默认软键盘,适用于数字输入、固定字符输入等场景:

  1. 定义:使用@Builder CustomKeyboard()构建键盘UI,包含按钮、布局等鸿蒙基础组件;
  2. 绑定:通过search.customKeyboard(this.CustomKeyboard())绑定到搜索框;
  3. 交互:在自定义键盘按钮的点击事件中,直接修改搜索框绑定的searchValue实现文本输入,通过controller.stopEditing()收起键盘。
5.2 自定义编辑菜单

通过配置EditMenuOptions对象,在系统默认编辑菜单基础上添加自定义菜单项,支持菜单项点击事件监听:

  1. 定义:创建返回值为EditMenuOptions的方法,包含onCreateMenuonMenuItemClick两个核心回调;
    • onCreateMenu:接收系统默认菜单项数组,可通过push添加自定义菜单项(包含content文字、id唯一标识);
    • onMenuItemClick:监听菜单项点击事件,入参为当前点击的菜单项对象;
  2. 绑定:通过search.editMenuOptions(this.CustomEditMenu())绑定到搜索框。

常用功能使用示例

1 基础搜索功能实现

  1. 绑定searchValue实时获取输入内容,通过onChange事件更新状态;
  2. 配置enterKeyType(EnterKeyType.Search)searchButton,通过onSubmit事件触发搜索逻辑;
  3. onSubmit中调用controller.stopEditing()收起键盘,提升交互体验。

2 光标与选区控制

  1. 移动光标:通过controller.caretPosition(索引值)将光标移到指定位置,示例:移到文本末尾controller.caretPosition(this.searchValue.length)
  2. 选中文本:通过controller.setTextSelection(起始索引, 结束索引)选中指定范围文本,示例:选中前3位controller.setTextSelection(0, 3)

3 输入内容过滤

通过inputFilter属性设置正则表达式,限制仅允许指定内容输入,示例:

.inputFilter('[a-zA-Z0-9\u4e00-\u9fa5\\s]*') // 仅允许中英文、数字、空格

4 输入/删除拦截

通过onWillInsertonWillDelete实现输入和删除行为的拦截,示例:

.onWillInsert((value) => { // 禁止输入空字符串 if (value.insertValue === ' ') return false; return true; })

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是持续创作的动力

http://www.cnnetsun.cn/news/2033400.html

相关文章:

  • Nginx/Apache网关超时?手把手教你排查和修复504 Gateway Timeout错误
  • DeepSeek总结的PostgreSQL 19查询提示功能
  • Unity网络通信避坑指南:从原生Socket到Mirror,我的多人聊天室开发踩坑实录
  • PKHeX自动合法性插件:新手5分钟快速上手宝可梦数据合规指南
  • ADAPT-VQE算法与格点规范理论的量子计算应用
  • 用Qt 5.14.2 + EMQX搭建本地物联网消息测试环境:从客户端到服务器一条龙配置
  • 终极二维码修复指南:使用QrazyBox拯救损坏的QR码
  • 5步掌握Navicat重置工具:macOS平台终极免费解决方案
  • 深入解析TrollInstallerX架构:从内核漏洞利用到iOS应用持久化的完整技术指南
  • 企业级托管钱包架构设计与MPC密钥管理:基于Go语言的生产级实践
  • GPU加速CFD求解器的异构计算优化策略
  • 【独家首发】LSTM预测模型验证的Docker资源配置最优解:基于27家金融机构生产负载的CPU/Mem/IO弹性配比公式
  • Python实战:鲁棒回归算法解析与工程应用
  • UE4开发避坑:手把手教你搞定PS4和Switch Pro手柄的Raw Input插件配置
  • 告别记事本!用GVim打造你的Windows专属代码编辑器(附详细_vimrc配置与插件推荐)
  • Qwen3.5-4B模型VMware虚拟机Ubuntu开发环境一站式配置
  • GitOps 实战:ArgoCD 在生产环境的多集群部署与管理
  • 我帮业主验过百套硬装,总结一套可直接照抄的标准
  • Qwen3-4B-Thinking创意写作效果:小说大纲+人物关系链+伏笔设计
  • Blazor 2026开发环境强制升级倒计时:.NET 9 SDK将在2026年4月1日终止对<9.0.200版本的NuGet签名验证(立即执行迁移检查清单)
  • 3分钟掌握B站视频缓存转换:让离线视频真正属于你
  • Qwen3.5-9B-GGUF开源大模型部署:Apache 2.0协议下商用微调全流程解析
  • 告别STM32开发板!手把手教你用Vivado在Zynq FPGA上“复刻”一个Cortex-M3软核
  • 5个核心机制深度剖析:Seraphine如何将LCU API转化为你的英雄联盟智能助手
  • WebToEpub:一键将网页小说转换为EPUB电子书的终极方案
  • 从F-22到你的手机:拆解‘有源相控阵’技术,看它如何悄悄改变我们的生活
  • 实测分享:用速腾RS-Helios-16P和百元级IMU跑通Fast-LIO2,低成本SLAM方案可行吗?
  • 不用C盘!MaixPy3开发环境最佳实践:自定义安装路径+多版本管理技巧
  • 知乎API库:Python开发者的社交数据采集利器
  • 技能集体演化:SkillClaw如何让多用户Agent系统“越用越强“