HarmonyOS Next 快速参考手册 - 实践
HarmonyOS Next 快速参考手册
常用组件、API、代码片段速查表
装饰器速查
组件装饰器
@Entry // 页面入口
@Component // 自定义组件
@Preview // 预览组件(开发时)
状态管理装饰器
@State // 组件内部状态
@Prop // 单向传递(父→子)
@Link // 双向绑定(父↔子)
@Provide // 跨层级传递(祖先→后代)
@Consume // 跨层级接收
@ObjectLink // 嵌套对象双向绑定
@Observed // 观察对象变化
@Watch // 监听状态变化
@StorageLink // 全局状态双向绑定
@StorageProp // 全局状态单向传递
构建装饰器
@Builder // 自定义构建函数
@BuilderParam // 插槽参数
@Extend // 扩展组件样式
@Styles // 样式集合
布局容器
Column - 垂直布局
Column({ space: 10 }) { // space: 子组件间距
Text('项目1')
Text('项目2')
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center) // 主轴对齐
.alignItems(HorizontalAlign.Center) // 交叉轴对齐
对齐方式:
FlexAlign.Start- 顶部FlexAlign.Center- 居中FlexAlign.End- 底部FlexAlign.SpaceBetween- 两端对齐FlexAlign.SpaceAround- 环绕对齐FlexAlign.SpaceEvenly- 平均分布
Row - 水平布局
Row({ space: 10 }) {
Text('项目1')
Text('项目2')
}
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
.alignItems(VerticalAlign.Center)
Stack - 堆叠布局
Stack({ alignContent: Alignment.TopEnd }) {
Image($r('app.media.bg')) // 背景层
Column() { } // 内容层
Button('浮动按钮') // 悬浮层
}
对齐方式:
Alignment.TopStart- 左上Alignment.Top- 顶部居中Alignment.TopEnd- 右上Alignment.Start- 左侧居中Alignment.Center- 居中Alignment.End- 右侧居中Alignment.BottomStart- 左下Alignment.Bottom- 底部居中Alignment.BottomEnd- 右下
Flex - 弹性布局
Flex({
direction: FlexDirection.Row, // 方向
wrap: FlexWrap.Wrap, // 换行
justifyContent: FlexAlign.SpaceBetween, // 主轴对齐
alignItems: ItemAlign.Center, // 交叉轴对齐
alignContent: FlexAlign.Start // 多行对齐
}) {
Text('项目1').flexGrow(1) // 占据剩余空间
Text('项目2').flexShrink(1) // 收缩比例
}
Grid - 网格布局
Grid() {
ForEach(items, (item) => {
GridItem() {
Text(item)
}
})
}
.rowsTemplate('1fr 1fr 1fr') // 3行
.columnsTemplate('1fr 1fr') // 2列
.rowsGap(10) // 行间距
.columnsGap(10) // 列间距
List - 列表布局
List({ space: 10 }) {
ForEach(items, (item) => {
ListItem() {
Text(item)
}
})
}
.scrollBar(BarState.Auto) // 滚动条
.edgeEffect(EdgeEffect.Spring) // 边缘效果
.divider({ // 分割线
strokeWidth: 1,
color: '#E0E0E0'
})
基础组件
Text - 文本
Text('Hello World')
.fontSize(16) // 字体大小
.fontColor('#333333') // 字体颜色
.fontWeight(FontWeight.Bold) // 字体粗细
.fontFamily('Arial') // 字体家族
.textAlign(TextAlign.Center) // 对齐方式
.lineHeight(24) // 行高
.maxLines(2) // 最大行数
.textOverflow({ // 溢出处理
overflow: TextOverflow.Ellipsis
})
.decoration({ // 装饰线
type: TextDecorationType.Underline,
color: Color.Red
})
Image - 图片
Image($r('app.media.icon'))
.width(100)
.height(100)
.objectFit(ImageFit.Cover) // 填充模式
.interpolation(ImageInterpolation.High) // 插值模式
.sourceSize({ width: 200, height: 200 }) // 源尺寸
.fillColor('#FF0000') // 填充颜色(SVG)
.alt($r('app.media.placeholder')) // 占位图
ImageFit 枚举:
ImageFit.Contain- 保持比例,完整显示ImageFit.Cover- 保持比例,填充容器ImageFit.Fill- 拉伸填充ImageFit.ScaleDown- 缩小显示ImageFit.None- 原始尺寸
Button - 按钮
Button('点击')
.type(ButtonType.Normal) // 按钮类型
.fontSize(16)
.fontColor(Color.White)
.backgroundColor('#4D91FF')
.borderRadius(8)
.width('100%')
.height(48)
.enabled(true) // 是否启用
.onClick(() => {
console.log('按钮点击')
})
ButtonType 枚举:
ButtonType.Normal- 普通按钮ButtonType.Capsule- 胶囊按钮ButtonType.Circle- 圆形按钮
TextInput - 文本输入
TextInput({ placeholder: '请输入' })
.type(InputType.Normal) // 输入类型
.maxLength(50) // 最大长度
.fontSize(16)
.fontColor('#333333')
.backgroundColor(Color.White)
.borderRadius(8)
.padding(12)
.onChange((value: string) => { // 输入变化
console.log('输入值:', value)
})
.onSubmit(() => { // 提交(回车)
console.log('提交表单')
})
InputType 枚举:
InputType.Normal- 普通文本InputType.Password- 密码InputType.Email- 邮箱InputType.Number- 数字InputType.PhoneNumber- 电话号码
Checkbox - 复选框
Checkbox()
.select(true) // 是否选中
.selectedColor('#4D91FF') // 选中颜色
.onChange((value: boolean) => {
console.log('选中状态:', value)
})
Radio - 单选框
Row() {
Radio({ value: 'option1', group: 'radioGroup' })
.checked(true)
.onChange((checked: boolean) => {
if (checked) {
console.log('选中 option1')
}
})
Text('选项1')
}
Slider - 滑块
Slider({
value: 50, // 当前值
min: 0, // 最小值
max: 100, // 最大值
step: 1 // 步长
})
.showSteps(true) // 显示步长刻度
.showTips(true) // 显示提示
.onChange((value: number) => {
console.log('滑块值:', value)
})
Progress - 进度条
Progress({ value: 50, total: 100, type: ProgressType.Linear })
.color('#4D91FF')
.width('80%')
.height(10)
ProgressType 枚举:
ProgressType.Linear- 线性进度条ProgressType.Ring- 环形进度条ProgressType.Eclipse- 椭圆进度条ProgressType.ScaleRing- 刻度环形ProgressType.Capsule- 胶囊进度条
高级组件
Tabs - 标签页
Tabs({ barPosition: BarPosition.End }) {
TabContent() {
Text('首页内容')
}.tabBar('首页')
TabContent() {
Text('我的内容')
}.tabBar('我的')
}
.onChange((index: number) => {
console.log('切换到标签:', index)
})
Swiper - 轮播
Swiper() {
ForEach(images, (img) => {
Image(img)
})
}
.loop(true) // 循环播放
.autoPlay(true) // 自动播放
.interval(3000) // 间隔时间
.indicator(true) // 显示指示器
.onChange((index: number) => {
console.log('当前页:', index)
})
Navigation - 导航
Navigation(this.pathStack) {
// 页面内容
}
.mode(NavigationMode.Stack) // 导航模式
.title('页面标题') // 标题
.hideTitleBar(false) // 隐藏标题栏
.hideBackButton(false) // 隐藏返回按钮
NavDestination - 导航目标
NavDestination() {
Column() {
Text('页面内容')
}
}
.title('页面标题')
.onReady((context: NavDestinationContext) => {
// 获取路由参数
const params = context.pathInfo?.param
})
Scroll - 滚动容器
Scroll() {
Column() {
// 长内容
}
}
.scrollable(ScrollDirection.Vertical) // 滚动方向
.scrollBar(BarState.Auto) // 滚动条
.scrollBarWidth(4) // 滚动条宽度
.edgeEffect(EdgeEffect.Spring) // 边缘效果
.onScroll((xOffset: number, yOffset: number) => {
console.log('滚动偏移:', xOffset, yOffset)
})
Refresh - 下拉刷新
Refresh({ refreshing: $$this.isRefreshing }) {
List() {
// 列表内容
}
}
.onRefreshing(() => {
// 刷新逻辑
this.loadData()
})
渲染控制
ForEach - 循环渲染
ForEach(
this.items, // 数据源
(item: Item, index: number) => { // 渲染函数
Text(item.name)
},
(item: Item) => item.id // key生成函数
)
if/else - 条件渲染
if (this.isShow) {
Text('显示')
} else {
Text('隐藏')
}
LazyForEach - 懒加载
LazyForEach(
this.dataSource, // 数据源(IDataSource)
(item: Item) => {
ListItem() {
Text(item.name)
}
},
(item: Item) => item.id
)
样式属性
尺寸
.width(100) // 固定宽度
.width('50%') // 百分比宽度
.width('100vp') // vp单位
.height(100)
.aspectRatio(1) // 宽高比
.layoutWeight(1) // 权重(占据剩余空间)
边距
.margin(10) // 四周
.margin({ top: 10, bottom: 10 }) // 上下
.margin({ left: 10, right: 10 }) // 左右
.padding(10) // 内边距
背景
.backgroundColor('#FFFFFF') // 背景色
.backgroundImage($r('app.media.bg')) // 背景图
.backgroundImageSize(ImageSize.Cover) // 背景图尺寸
.linearGradient({ // 渐变
angle: 180,
colors: [[0xFF0000, 0.0], [0x00FF00, 1.0]]
})
边框
.border({
width: 1,
color: '#E0E0E0',
radius: 8,
style: BorderStyle.Solid
})
.borderRadius(8) // 圆角
阴影
.shadow({
radius: 10,
color: '#00000020',
offsetX: 0,
offsetY: 2
})
透明度
.opacity(0.5) // 0.0 - 1.0
变换
.rotate({ angle: 45 }) // 旋转
.scale({ x: 1.5, y: 1.5 }) // 缩放
.translate({ x: 10, y: 10 }) // 平移
位置
.position({ x: 0, y: 0 }) // 绝对定位
.offset({ x: 10, y: 10 }) // 相对偏移
路由导航
router - 页面路由
import { router } from '@kit.ArkUI'
// 跳转页面
router.pushUrl({ url: 'pages/DetailPage' })
// 跳转并传参
router.pushUrl({
url: 'pages/DetailPage',
params: { id: '123', name: '张三' }
})
// 替换当前页面
router.replaceUrl({ url: 'pages/HomePage' })
// 返回上一页
router.back()
// 返回指定页面
router.back({ url: 'pages/Index' })
// 获取路由参数
const params = router.getParams() as Record<string, string>
Navigation - 导航栈
// 创建路由栈
pathStack: NavPathStack = new NavPathStack()
// 跳转
this.pathStack.pushPathByName('PageName', params)
// 返回
this.pathStack.pop()
// 清空
this.pathStack.clear()
// 获取栈大小
const size = this.pathStack.size()
状态存储
AppStorage - 应用级存储
// 设置
AppStorage.setOrCreate('key', 'value')
AppStorage.set('key', 'newValue')
// 获取
const value = AppStorage.get<string>('key')// 删除AppStorage.delete('key')// 组件中使用@StorageLink('key') value: string = '' // 双向@StorageProp('key') value: string = '' // 单向
LocalStorage - 页面级存储
// 创建
let storage = new LocalStorage({ count: 0 })
// 组件中使用
@LocalStorageLink('count') count: number = 0
@LocalStorageProp('count') count: number = 0
PersistentStorage - 持久化存储
// 持久化数据
PersistentStorage.persistProp('token', '')
// 设置值
AppStorage.set('token', 'abc123')
// 下次启动自动恢复
动画
显式动画
animateTo({
duration: 1000, // 持续时间
curve: Curve.EaseInOut, // 动画曲线
delay: 0, // 延迟
iterations: 1, // 迭代次数(-1 无限)
playMode: PlayMode.Normal, // 播放模式
onFinish: () => { // 完成回调
console.log('动画完成')
}
}, () => {
// 状态变化
this.scaleValue = 1.5
})
Curve 枚举:
Curve.Linear- 线性Curve.EaseIn- 淡入Curve.EaseOut- 淡出Curve.EaseInOut- 淡入淡出Curve.FastOutSlowIn- 快出慢入
组件内置动画
Column()
.width(100)
.height(100)
.animation({
duration: 300,
curve: Curve.EaseInOut
})
转场动画
if (this.isShow) {
Column() { }
.transition({
type: TransitionType.Insert,
opacity: 0,
translate: { x: 0, y: 100 }
})
}
系统能力
promptAction - 提示
import { promptAction } from '@kit.ArkUI'
// 消息提示
promptAction.showToast({
message: '操作成功',
duration: 2000
})
// 对话框
promptAction.showDialog({
title: '提示',
message: '确认删除?',
buttons: [
{ text: '取消', color: '#999999' },
{ text: '确定', color: '#FF0000' }
]
}).then((data) => {
if (data.index === 1) {
console.log('点击确定')
}
})
Preferences - 首选项
import { preferences } from '@kit.ArkData'
// 获取实例
let pref = await preferences.getPreferences(context, 'myStore')
// 存储
await pref.put('key', 'value')
await pref.flush()
// 读取
let value = await pref.get('key', 'defaultValue')
// 删除
await pref.delete('key')
️ 常用工具
JSON 操作
// 对象转字符串
const jsonStr = JSON.stringify(obj)
// 字符串转对象
const obj = JSON.parse(jsonStr)
定时器
// 延时执行
setTimeout(() => {
console.log('延时执行')
}, 1000)
// 定时执行
const timerId = setInterval(() => {
console.log('定时执行')
}, 1000)
// 清除定时器
clearInterval(timerId)
日期时间
// 当前时间戳
const timestamp = Date.now()
// 日期对象
const date = new Date()
const year = date.getFullYear()
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours()
const minute = date.getMinutes()
单位说明
100 // px (像素)
'100vp' // vp (虚拟像素,自适应)
'100fp' // fp (字体像素,自适应)
'50%' // 百分比
'100lpx' // lpx (逻辑像素)
推荐使用:
- 尺寸:
vp - 字体:
fp - 百分比:
%
快速代码片段
基础页面模板
@Entry
@Component
struct PageName {
aboutToAppear() {
// 页面加载
}
build() {
Column() {
Text('页面内容')
}
.width('100%')
.height('100%')
}
}
自定义组件模板
@Component
export default struct ComponentName {
@Prop data: DataType
build() {
Column() {
Text('组件内容')
}
}
}
列表页面模板
@Entry
@Component
struct ListPage {
@State items: string[] = []
build() {
Column() {
List({ space: 10 }) {
ForEach(this.items, (item: string) => {
ListItem() {
Text(item)
}
})
}
}
}
}
表单页面模板
@Entry
@Component
struct FormPage {
@State username: string = ''
@State password: string = ''
handleSubmit() {
console.log('提交表单')
}
build() {
Column({ space: 16 }) {
TextInput({ placeholder: '用户名' })
.onChange((value) => this.username = value)
TextInput({ placeholder: '密码' })
.type(InputType.Password)
.onChange((value) => this.password = value)
Button('提交')
.onClick(() => this.handleSubmit())
}
.padding(24)
}
}
资源引用
// 图片
$r('app.media.icon_name')
// 字符串
$r('app.string.app_name')
// 颜色
$r('app.color.primary_color')
// 尺寸
$r('app.float.title_font_size')
// 布尔
$r('app.boolean.is_debug')
调试技巧
// 控制台输出
console.log('普通日志')
console.info('信息日志')
console.warn('警告日志')
console.error('错误日志')
// 对象输出
console.log('数据:', JSON.stringify(obj))
// 性能测试
const start = Date.now()
// 执行代码
const end = Date.now()
console.log('耗时:', end - start, 'ms')
注意事项
命名规范
- 文件名: PascalCase (例:
HomePage.ets) - 组件名: PascalCase (例:
struct HomePage) - 变量名: camelCase (例:
userName) - 常量名: UPPER_CASE (例:
MAX_COUNT)
性能优化
- ✅ 使用
LazyForEach处理长列表 - ✅ 避免在
build()中执行耗时操作 - ✅ 合理使用
@State,避免不必要的状态 - ✅ 图片资源使用适当尺寸
- ✅ 及时清除定时器和监听器
常见错误
// ❌ 错误:直接修改 @Prop
@Prop count: number
this.count++ // 报错
// ✅ 正确:使用 @Link 或回调
@Link count: number
this.count++ // 可以
// ❌ 错误:@BuilderParam 直接调用
contentBuilder: this.myBuilder()
// ✅ 正确:传递引用
contentBuilder: this.myBuilder
// ❌ 错误:忘记清除定时器
aboutToDisappear() {
// 没有清除定时器
}
// ✅ 正确:清除定时器
aboutToDisappear() {
clearInterval(this.timerId)
}
建议: 将此文档保存为书签,开发时随时查阅!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964341.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
国标GB28181算法算力平台EasyGBS:构筑公安数字化安防的“核心枢纽”
国标GB28181算法算力平台EasyGBS:构筑公安数字化安防的“核心枢纽”随着平安城市、智慧公安建设的深入推进,公安领域的安防体系正经历着从“看得见”到“看得懂”的数字化嬗变。在这一过程中,如何将海量、异构的前端…
2025年11月重庆眼镜店最新推荐,覆盖青少年配眼镜/儿童配眼镜/老年人配眼镜/全人群配镜需求
当前重庆地区不同年龄段人群对配镜需求愈发细分,青少年近视防控、儿童视力矫正、老年人花镜适配等核心诉求不断提升,但市场上眼镜店资质参差不齐,部分店铺存在验光精度不足、镜片材质劣质、售后保障缺失等问题,导致…
2、聚合查询(聚合函数)
常见聚合函数:函数功能count
统计数量max
最大值min
最小值avg
平均值sum
求和语法:SELECT 聚合函数(字段列表) FROM 表名;例:SELECT count(id) from employee where workaddress = "广东省";字符串函数函…
字节新动作!豆包编程模型 Doubao-Seed-Code 正式亮相,AI 写项目时代来了
关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集
就在最近,字节跳动再次在 AI 编程领域出手——火山引擎正式发布 豆包编程模型 Doubao-Seed-Code,并针对企业用户上线了 TRAE CN 企业版公…
吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(六)课后习题和代码实践
此分类用于记录吴恩达深度学习课程的学习笔记。
课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai
github课程资料,含课件与笔记:吴恩达深度学习教学资料
课程配套练习(中英)与答案…
一、MySQL 认识
一、SQL是什么?
SQL 是结构化查询语言的缩写,是一种专门用来与关系型数据库进行通信和管理的标准计算机语言。是用于管理和操作关系型数据库的标准化语言。
你可以把它理解为:对数据库的“指令”或“问题”:你用SQ…
2025年北京物业合作公司权威推荐榜单:医院物业加盟/学校物业加盟/物业加盟合作伙伴精选
随着城市化进程的加速和物业服务需求的多元化,北京物业管理行业已形成专业化、智慧化、综合化的发展趋势。物业服务企业不仅需具备基础管理能力,更需在服务质量、技术应用和资源整合方面展现核心竞争力。根据2024年北…
深入解析:Django与Tornado框架深度对比:从MVCMTV到高并发架构设计
深入解析:Django与Tornado框架深度对比:从MVCMTV到高并发架构设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…
2025年重庆配眼镜标杆商家最新推荐:雷曼森眼镜,青少年配眼镜|儿童配眼镜|老年人配眼镜|个性化验配新标准
随着大众视力健康意识提升及用眼场景多样化,眼镜消费已从单一矫正需求升级为功能化、个性化与舒适化并重的服务。2025年,重庆眼镜市场持续扩大,但商家专业水平、验配技术、产品适配性及服务质量参差不齐,消费者在选…
测试岗位所需的工作能力
在现代软件开发中,无论是新入行还是转型软件测试工程师,需要先掌握软件的重要性和必要性。
为什么要有软件测试
当然!这是一个非常核心且重要的问题。简单来说,软件测试之所以存在,是因为人类会犯错,而由人类编写…
2025年PVC塑料桥架批发厂家权威推荐榜单:复合材料桥架/玻璃钢桥架/聚氨酯桥架源头厂家精选
在电气线路安全日益受到重视的今天,PVC塑料桥架以其优异的耐腐蚀、绝缘性能正成为众多工程项目的关键材料,选择可靠的批发厂家对项目成功至关重要。
PVC塑料桥架作为电缆管理系统的关键组成部分,在化工、电力、通信…
3、分组查询 GROUP BY
语法:SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];where 和 having 的区别: 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;
having是分组后…
2025年节能环保过滤器制造厂权威推荐榜单:柴油节能减排/重卡节能环保/锅炉过滤器源头厂家精选
随着国家"双碳"战略的深入推进,节能环保过滤器行业迎来快速发展。据2024年行业数据显示,我国节能环保设备市场规模已突破8000亿元,其中节能滤清器在重型运输和工业锅炉领域的渗透率同比增长23.7%。以下通…
How to make your GCC kawaii in Dev-C++
如何使你的 GCC 变可爱(适配 Dev-C++)
kawaii-gcc 项目通过修改 GCC 的本地化翻译文件,使得你的 GCC 变得可爱雌小鬼!1. 下载 kawaii-gcc
从 Github Bill-Haku/kawaii-gcc 下载编译后的 .mo 文件。
如果您能正常访…
2025年工业制冷品牌推荐排行榜:专业评测与选择指南
摘要
工业制冷行业在2025年持续快速发展,随着节能环保需求的提升和技术的创新,高效、可靠的制冷解决方案成为企业核心需求。本文基于市场调研和权威数据,为您呈现top 5工业制冷品牌排名,并提供详细评测,帮助用户做…
2025年国内工业制冷品牌十大厂家权威推荐排行榜
摘要
随着工业制冷技术的快速发展,2025年国内工业制冷行业正迎来新一轮的技术革新与市场洗牌。高效节能、智能控制、全生命周期服务成为行业新趋势。本文基于市场调研和用户口碑,为您精选十大工业制冷品牌厂家,并提…
AI知识库搭建新纪元:5分钟构建企业智慧大脑
AI知识库搭建新纪元:5分钟构建企业智慧大脑“小王,新来的实习生又来找我问报销流程了,这周都第三次了...”
“我们技术文档到底哪个版本是最新的?上次更新后好像有人还在用旧版...”
“客户半夜咨询产品问题,客服…
2025年阜阳民事纠纷律师排行榜前十强权威推荐
摘要
随着法治建设的深入推进,阜阳市民事纠纷法律服务行业在2025年呈现专业化、精细化发展趋势。本文基于权威数据分析和用户口碑评价,为您精选阜阳地区十大民事纠纷律师,并提供详细的服务能力对比。文末附专业选择…