HarmonyOS 鸿蒙Next《仿盒马》app开发技术分享--回收订单页功能完善
HarmonyOS 鸿蒙Next《仿盒马》app开发技术分享- 回收订单页功能完善
技术栈
Appgallery connect
开发准备
上一节我们实现了订单的待取件、已取消状态展示,并且成功实现了修改订单状态后的列表刷新,实现了云端数据的修改,这一节我们来实现订单页剩下的两个板块的业务逻辑,分别是运输中、已完成状态下的列表展示以及订单状态的修改
功能分析
要实现运输中、已完成订单状态我们分别要先实现tab切换时组件刷新的方法,根据对应的index来实现当前页面的刷新,然后在刷新方法中请求云数据库的数据展示到页面上,通过userid与ordertype去筛选对应的订单,取出符合要求的数据,在不同的状态栏中我们还需要实现修改当前点击订单的状态,实现本地列表的更新和云端订单状态的修改
代码实现
首先实现运输中页面
@State currentIndexCheck: number = 2
@Prop @Watch("onRefresh") currentIndex:number=0
async onRefresh(): Promise<void> {
if (this.currentIndexCheck==this.currentIndex) {
let databaseZone = cloudDatabase.zone('default');
let condition = new cloudDatabase.DatabaseQuery(recycle_info);
condition.equalTo("user_id",this.user?.user_id).and().equalTo("order_type",2)
let listData = await databaseZone.query(condition);
let json = JSON.stringify(listData)
let data1:RecycleInfo[]= JSON.parse(json)
this.orderList=data1
this.flag=true
}
}
在这里通过刷新方法来请求云端数据根据条件查询拿到对应的数据集合,展示到列表中
List({space:10}){
ForEach(this.orderList,(item:RecycleInfo,index:number)=>{
ListItem(){
Column({space:10}){
Row(){
Text("订单编号:"+item.express_code)
.fontColor(Color.Black)
.fontSize(14)
Text("运输中")
.fontColor(Color.Black)
.fontSize(14)
}
.justifyContent(FlexAlign.SpaceBetween)
.width('100%')
Row({space:10}){
Image($r('app.media.background'))
.height(40)
.width(40)
.borderRadius(5)
Column({space:10}){
Text("回收品类 衣帽鞋包")
.fontColor(Color.Black)
.fontSize(14)
Text("预约时间 "+item.create_time)
.fontColor(Color.Black)
.fontSize(14)
Text("联系方式 "+item.phone)
.fontColor(Color.Black)
.fontSize(14)
Text("取件地址 "+item.address)
.fontColor(Color.Black)
.fontSize(14)
}
.alignItems(HorizontalAlign.Start)
}
.margin({top:10})
.alignItems(VerticalAlign.Top)
.width('100%')
.justifyContent(FlexAlign.Start)
Row({space:10}){
Text()
Blank()
Text("订单完成")
.fontColor(Color.Black)
.fontSize(12)
.padding(5)
.borderRadius(10)
.backgroundColor(Color.Pink)
}
.width('100%')
}
.padding(10)
.backgroundColor(Color.White)
.borderRadius(10)
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
}
})
}
然后在订单中通过点击订单完成按钮完成对订单状态的修改
Text("订单完成")
.fontColor(Color.Black)
.fontSize(12)
.padding(5)
.borderRadius(10)
.backgroundColor(Color.Pink)
.onClick(async ()=>{
let data=new recycle_info()
data.id=item.id
data.user_id=item.user_id
data.nike_name=item.nike_name
data.phone=item.phone
data.address=item.address
data.day=item.day
data.start_time=item.start_time
data.end_time=item.end_time
data.msg=item.msg
data.weight_id=item.weight_id
data.create_time=item.create_time
data.express_code=item.express_code
data.express_people=item.express_people
data.express_company=item.express_company
data.order_type=3
data.logistics_id=item.logistics_id
let num = await databaseZone.upsert(data);
hilog.info(0x0000, 'testTag', `Succeeded in upserting data, result: ${num}`);
if (num>0) {
this.onRefresh()
showToast("订单已完成")
}
})
然后我们的已完成订单页面,我们如法炮制
@State currentIndexCheck: number = 3
@Prop @Watch("onRefresh") currentIndex:number=0
async onRefresh(): Promise<void> {
if (this.currentIndexCheck==this.currentIndex) {
let databaseZone = cloudDatabase.zone('default');
let condition = new cloudDatabase.DatabaseQuery(recycle_info);
condition.equalTo("user_id",this.user?.user_id).and().equalTo("order_type",3)
let listData = await databaseZone.query(condition);
let json = JSON.stringify(listData)
let data1:RecycleInfo[]= JSON.parse(json)
this.orderList=data1
this.flag=true
}
}
因为已完成页面不需要修改订单状态,仅需要展示,所以数据查询出来之后直接展示到list中即可
List({space:10}){
ForEach(this.orderList,(item:RecycleInfo,index:number)=>{
ListItem(){
Column({space:10}){
Row(){
Text("订单编号:"+item.express_code)
.fontColor(Color.Black)
.fontSize(14)
Text("已完成")
.fontColor(Color.Black)
.fontSize(14)
}
.justifyContent(FlexAlign.SpaceBetween)
.width('100%')
Row({space:10}){
Image($r('app.media.background'))
.height(40)
.width(40)
.borderRadius(5)
Column({space:10}){
Text("回收品类 衣帽鞋包")
.fontColor(Color.Black)
.fontSize(14)
Text("预约时间 "+item.create_time)
.fontColor(Color.Black)
.fontSize(14)
Text("联系方式 "+item.phone)
.fontColor(Color.Black)
.fontSize(14)
Text("取件地址 "+item.address)
.fontColor(Color.Black)
.fontSize(14)
}
.alignItems(HorizontalAlign.Start)
}
.margin({top:10})
.alignItems(VerticalAlign.Top)
.width('100%')
.justifyContent(FlexAlign.Start)
Row({space:10}){
Text()
Blank()
}
.width('100%')
}
.padding(10)
.backgroundColor(Color.White)
.borderRadius(10)
.width('100%')
.justifyContent(FlexAlign.SpaceBetween)
}
})
}
更多关于HarmonyOS 鸿蒙Next《仿盒马》app开发技术分享--回收订单页功能完善的实战教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next《仿盒马》回收订单页功能完善可采用ArkUI框架实现。主要涉及:
- 使用List组件展示订单列表,配合ForEach渲染动态数据;
- 自定义ListItem布局展示订单详情;
- 通过@State管理选中状态;
- 添加SwipeAction实现侧滑删除操作;
- 采用Column+Flex布局处理顶部筛选栏。
数据层使用AppStorage进行状态共享,网络请求模块调用鸿蒙HTTP接口获取订单数据。可结合自定义弹窗组件实现订单状态修改等交互功能。
更多关于HarmonyOS 鸿蒙Next《仿盒马》app开发技术分享--回收订单页功能完善的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
从技术实现来看,这个订单状态管理模块有几个值得注意的HarmonyOS开发特点:
-
状态管理方面,使用
@State
和@Prop
装饰器实现了父子组件间的状态联动,通过@Watch
监听currentIndex
变化触发数据刷新,这是HarmonyOS推荐的响应式编程方式。 -
云数据库操作规范:
- 使用
zone('default')
获取默认数据库分区 - 通过
DatabaseQuery
构建查询条件,使用equalTo
进行字段匹配 upsert
方法实现数据更新插入一体化操作
- 使用
-
界面开发技巧:
List+ForEach
实现高性能列表渲染- 合理运用
Row/Column
布局和space
参数控制间距 - 使用链式调用设置文本样式,符合ArkUI声明式语法
-
业务逻辑处理:
- 通过
order_type
字段区分不同订单状态 - 点击事件中先更新本地数据再刷新云端,最后触发界面更新
- 使用
showToast
提供操作反馈
- 通过
代码结构清晰,符合HarmonyOS应用开发规范,实现了订单状态管理的核心功能。可以继续优化数据加载时的状态提示,以及考虑添加下拉刷新功能提升用户体验。