HarmonyOS 鸿蒙Next页面开发流程
HarmonyOS 鸿蒙Next页面开发流程
一、鸿蒙页面开发流程
在鸿蒙页面开发中,一般分为以下4步:
1、划分页面结构:遵循从上到下,从左至右的原则,划分页面结构,规划显示组件
2、确定页面状态变量:确定页数据所需状态变量,承载页面数据
3、封装显示组件:选择系统基础组件或自己绘制组件,组装成页面所需显示组件
4、组装显示组件:组装封装好的显示组件,绑定页面状态数据,展示页面
以二手物品列表页为例:
主体页面从上至下,分为三个主要部分,搜索区域、热门搜索显示、物品列表(有吸顶效果)
吸顶之后,列表分菜单部分与常规列表显示部分
确定页面结构划分之后,需要定义状态变量
@State oldMachineList: Array<OldMachine> = []
@State hud: HUDClass = new HUDClass()
@State showMenu: boolean = false
@State marginTop: number = 200
@State topLineHeight: number = 10
@State menuIndex: number = 0
@State menuAreaHeight: number = 260
确定页面所需状态变量之后,根据页面结构划分,封装页面所需显示组件
HotSearchComp
EsNjFbSearchHeaderComp
EsNjFilterItemComp
MenuSortComp
MenuNjCategoryComp
MenuRegionComp
MenuPriceAndBuyYearComp
MenuHeader
最后组装页面显示
Stack(){ this.MainView() this.MenuView() this.FloatButton() } .alignContent(Alignment.BottomEnd) .width(CommonConstants.FULL_PERCENT) .height(CommonConstants.FULL_PERCENT)
二、数据拉取
通过业务model类封装页面拉取数据方法,并将数据结果赋值给页面状态变量,刷新页面显示
njServiceModel: NjServiceModel = new NjServiceModel()
private requestData(done?: (isSuccess: boolean) => void){ this.hud.show() this.requestParam.pageNum = this.curPage this.njServiceModel.getEsNjList(this.requestParam.toPostParam()) .then(oldMachineWrapper => { if (this.curPage === 1) { this.oldMachineList = oldMachineWrapper.content } else { this.oldMachineList = this.oldMachineList.concat(oldMachineWrapper.content) } if (oldMachineWrapper.content.length > 0) { this.curPage += 1 } done && done(true) this.hud.dismiss(this.oldMachineList.length > 0) }) .catch((err: Error) => { done && done(false) this.hud.dismiss(this.oldMachineList.length > 0) }) }
三、自定义组件
利用系统组件组合出自己需要的组件
例如综合排序菜单,利用系统的list组件,结合本地数据,进行渲染显示
@Component export struct MenuSortComp{ @State sortItems: Array<FilterSort> = [ new FilterSort(‘综合排序’,’’, true), new FilterSort(‘更新时间’,‘updated’), new FilterSort(‘价格最低’,‘priceMin’), new FilterSort(‘价格最高’,‘priceMax’), new FilterSort(‘车龄最短’,‘buyDate’)] onItemClick: (item: FilterSort) => void = (item: FilterSort) => {} resetSelect(){ this.sortItems.forEach(item => { item.isSelect = false }) } build() { List(){ ForEach(this.sortItems, (item: FilterSort) => { ListItem(){ Text(item.name) .fontColor(item.isSelect ? ‘#01ae66’ : ‘#999999’) .fontSize(15) .padding(16) .width(‘100%’) .textAlign(TextAlign.Center) }.onClick((event) => { this.resetSelect() item.isSelect = true this.onItemClick(item) }) }, (item: FilterSort) => JSON.stringify(item)) } .divider({strokeWidth: 1, color: ResManager.getBackgroundColor()}) } }
四、自定义组件-绘制
在系统组件无法满足业务需求时,需要自定义绘制组件,如筛选菜单显示:
系统组件无法满足业务需求时,如slider组件,需要左右双向可拖动,并且单位刻度可变的组件,需要自己计算位置、利用Canvas绘制图形、处理反馈事件.
build() { Canvas(this.rContext) .width(‘100%’) .height(‘100%’) .onReady(() => { this.mWidth = this.rContext.width this.mHeight = this.rContext.height this.leftCircleCenterX = this.startX this.rightCircleCenterX = this.mWidth - this.startX let stepLen = (this.rightCircleCenterX - this.leftCircleCenterX)/this.steps this.startY = this.mHeight/3 for (let i = 0; i < this.steps+1; i++) { if (i == this.steps) { this.stepValueArr[i] = this.rightCircleCenterX }else{ this.stepValueArr[i] = this.leftCircleCenterX + stepLen*i } } this.invalidateView(this.startX) }) .onTouch((event: TouchEvent) => { switch (event.type){ case TouchType.Down: let downX = event.touches[0].x this.dragLeftCircle = this.xInLeftCircle(downX) this.dragRightCircle = this.xInRightCircle(downX) break case TouchType.Move: let moveX = event.touches[0].x if (moveX < this.startX) { moveX = this.startX } if (moveX > this.mWidth - this.startX) { moveX = this.mWidth - this.startX } this.invalidateView(moveX) break case TouchType.Up: let upX = event.touches[0].x let amendX = this.amendX(upX) this.invalidateView(amendX) let leftValue = this.stepValueArr.indexOf(this.leftCircleCenterX) * this.step let rightValue = this.stepValueArr.indexOf(this.rightCircleCenterX) * this.step if (leftValue < rightValue) { this.onSliderValueChange(leftValue, rightValue) }else { this.onSliderValueChange(rightValue, leftValue) } break } }) }
更多关于HarmonyOS 鸿蒙Next页面开发流程的实战教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS Next页面开发流程
HarmonyOS Next页面开发流程主要基于ArkTS语言和ArkUI框架。开发流程包括:
- 使用DevEco Studio创建工程;
- 在pages目录下创建.ets文件定义页面;
- 使用装饰器(如@Entry、@Component)声明UI组件;
- 通过build方法构建页面布局,使用内置组件(如Column、Text)和状态管理(如@State);
- 配置页面路由信息;
- 在模拟器或真机上进行预览和调试。
整个过程围绕声明式UI和组件化开发进行。
您分享的HarmonyOS Next页面开发流程总结得非常到位,清晰地阐述了从设计到实现的完整路径。这是一个非常标准的ArkTS声明式开发范式,对于实际项目开发具有很好的指导意义。
我对您流程中的几个关键点进行一些补充和强调:
-
状态管理与UI刷新:您正确地使用了
@State装饰器来管理页面状态。这是声明式UI的核心。当状态变量改变时,框架会自动重新计算并渲染依赖该状态的UI部分。在数据拉取示例中,对oldMachineList的赋值操作触发了页面的高效局部刷新。 -
组件化与复用:您将页面拆分为
HotSearchComp、MenuSortComp等多个自定义组件(@Component),这是构建可维护、可复用应用架构的最佳实践。每个组件管理自己的内部状态(使用@State)或通过参数接收外部数据(使用@Prop或@Link)。 -
数据请求的封装:将网络请求逻辑封装在独立的
NjServiceModel业务模型中,与UI层解耦,使得代码结构更清晰,也便于测试和维护。这是非常推荐的做法。 -
高级UI绘制:在系统组件不满足需求时,使用
Canvas进行自定义绘制是终极解决方案。您的示例展示了如何处理触摸事件(onTouch)、进行图形渲染和业务逻辑计算,这对于实现复杂的交互控件(如自定义滑块、图表等)至关重要。
一个值得讨论的优化点:
在您的“综合排序菜单”组件(MenuSortComp)中,ForEach渲染函数使用的键(key)生成函数是(item: FilterSort) => JSON.stringify(item)。这在小数据量或简单对象时可行,但存在潜在性能开销(每次渲染都进行序列化)和风险(如果对象包含循环引用或不可序列化字段)。最佳实践是为数据源提供一个唯一且稳定的标识符(如item.id),直接作为key,即(item: FilterSort) => item.id。这能帮助框架更精确地识别数组项的变更,从而进行高效的UI更新。
总的来说,您描述的流程完全符合HarmonyOS Next应用开发的主流模式,从结构规划、状态设计、组件封装到数据对接,形成了一个完整的闭环,是高质量应用开发的典范路径。

