介绍
本示例使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
效果预览
使用说明
- 进入英国威廉希尔公司网站 后弹出广告弹窗,点击即可关闭。
- 点击商品列表中的一个商品可以跳转到商品详情页。
- 在商品详情页点击英国威廉希尔公司网站 可以返回到商品列表页,点击购物车可以跳转到购物车页面,点击加入购物车可以在购物车页面添加一条商品信息,点击立即购买可以增加一次已购物数量显示在购物车页面。
- 在购物车页面点击购物车列表内商品的减号图标,可以将此商品信息从购物车列表内删除,点击清空购买数量可以将已购物数量清空、显示为0。
- 鸿蒙开发文档参考:[
qr23.cn/AKFP8k
]
代码解析
HarmonyOS&OpenHarmony文档紫料添加v
mau123789直接拿取
entry/src/main/ets/
|---components
| |---BottomNavigation.ets // 底部按钮导航栏
| |---Choice.ets // 商品规格选择
| |---EventsDialog.ets // 广告弹窗
| |---Information.ets // 详细信息页面
| |---Valueation.ets // 价格页面
|---mock
| |---DetailData.ets // 商品详情数据
| |---ProductsData.ets // 产品列表数据
|---model
| |---DetailMode.ets // 商品详情数据结构
| |---GoodsModel.ets // 商品数据结构
|---pages
| |---Detail.ets // 商品详情
| |---Index.ets // 英国威廉希尔公司网站
| |---ShopCart.ets // 购物车
|---shoppingCart
| |---Cart.ets // 购物车
| |---FavorGoodlist.ets // 推荐列表
|---util
| |---Logger.ets // 日志工具
feature/emitter/src/main/ets/
|---common
| |---EmitterConst.ts // 事件通知常量
|---components
| |---feature
| | |---CustomEmitter.ets // 封装事件通知类
具体实现
- 订阅事件通知在CustomEmitter中实现,源码参考[CustomEmitter.ets]
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import emitter from '@ohos.events.emitter';
import { EmitterConst } from '../../common/EmitterConst';
import Base from '@ohos.base';
class GoodsListInner {
id: number = 0
}
class GoodsList {
data: GoodsListInner = {
id: 0
}
}
export class CustomEmitter {
shoppingCartGoodsList: GoodsList[] = [];
// 单次订阅回调
public showEventsDialog(callback: Base.Callback< emitter.EventData >) {
let dialogShowEventsId: emitter.InnerEvent = {
eventId: EmitterConst.DIALOG_EVENT_ID
};
let dialogShowEventsData: emitter.EventData = {
data: {
id: EmitterConst.DIALOG_EVENT_ID,
}
};
// 单次订阅事件--广告
emitter.once(dialogShowEventsId, callback);
// 事件发布
emitter.emit(dialogShowEventsId, dialogShowEventsData);
}
// 单次订阅回调(eventId为string类型)
public closeEventsDialog(callback: Base.Callback< emitter.EventData >) {
let dialogCloseEventsData: emitter.EventData = {
data: {
id: EmitterConst.CLOSE_DIALOG_EVENT_ID
}
};
// 单次订阅事件--关闭广告
emitter.once(EmitterConst.CLOSE_DIALOG_EVENT_ID, callback);
// 事件发布
emitter.emit(EmitterConst.CLOSE_DIALOG_EVENT_ID, dialogCloseEventsData);
}
// 持久化订阅的事件回调
public setShoppingCartGoodsList(callback: (eventData: emitter.EventData) = > void) {
let addGoodDataId: emitter.InnerEvent = {
eventId: EmitterConst.ADD_EVENT_ID
};
// 以持久化方式订阅购物车添加事件并接收事件回调
emitter.off(EmitterConst.ADD_EVENT_ID);
emitter.on(addGoodDataId, (eventData: emitter.EventData) = > {
callback(eventData);
});
}
// 持久化订阅的事件回调(eventId为string类型)
public deleteShoppingCartGoodsList(callback: (eventData: emitter.EventData) = > void) {
// 以持久化方式订阅购物车删除事件并接收事件回调
emitter.off(EmitterConst.DELETE_EVENT_ID);
emitter.on(EmitterConst.DELETE_EVENT_ID, (eventData: emitter.EventData) = > {
callback(eventData);
});
}
public addGoods(goodId: number) {
let addToShoppingCartId: emitter.InnerEvent = {
eventId: EmitterConst.ADD_EVENT_ID
};
let shoppingCartData: emitter.EventData = {
data: {
id: goodId
}
};
// 持续订阅发布事件
emitter.emit(addToShoppingCartId, shoppingCartData);
}
public deleteGoods(listItemId: number) {
console.info("setShoppingCartGoodsList goodId" + JSON.stringify(listItemId))
let shoppingCartData: emitter.EventData = {
data: {
id: listItemId,
}
};
// 持续订阅发布事件
emitter.emit(EmitterConst.DELETE_EVENT_ID, shoppingCartData);
}
// 以持久化方式订阅购物车购买事件
public listenerEvents() {
emitter.on(EmitterConst.BUY_EVENT_ID, (eventData: emitter.EventData) = > {
});
}
// 获取购买事件订阅者数量并将结果返回
public getListenerCounts(callback: (counts: number) = > void) {
callback(emitter.getListenerCount(EmitterConst.BUY_EVENT_ID));
}
// 取消订阅购买事件后将购买事件订阅者数量结果返回
public clearListenerCounts(callback: (counts: number) = > void) {
emitter.off(EmitterConst.BUY_EVENT_ID);
callback(emitter.getListenerCount(EmitterConst.BUY_EVENT_ID));
}
}
- 广告弹窗:使用Emitter的事件单次订阅emitter.once(eventId,call),eventId为number类型,单次订阅CustomDialogController弹窗事件,弹窗触发后自动取消订阅。
- 关闭广告弹窗:使用Emitter的事件单次订阅emitter.once(eventId,call),eventId为string类型,单次订阅CustomDialogController弹窗事件,弹窗关闭后自动取消订阅。
- 购物车添加商品:使用Emitter.on持续订阅商品添加事件,eventId为number类型,添加商品时更新购物车商品列表。
- 购物车删除商品:使用Emitter.on持续订阅商品删除事件,eventId为string类型,删除商品时更新购物车商品列表。
- 购物数量:使用Emitter.getListenerCount获取购买事件订阅者数量,进入购物车页面显示数量结果,清空时取消订阅,结果为0。
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
鸿蒙
+关注
关注
57文章
2348浏览量
42831 -
HarmonyOS
+关注
关注
79文章
1974浏览量
30166 -
OpenHarmony
+关注
关注
25文章
3718浏览量
16297
发布评论请先 登录
相关推荐
NIOS II自定义指令设计之实例篇
在【原创】SOPC用户自定义指令设计之软件篇 和【原创】SOPC用户自定义指令设计之硬件篇 中分别讲述了自定义指令在软件和硬件设计中的规范,在本文中,将给出一个具
发表于 03-27 17:56
•3178次阅读
LabVIEW自定义控件
:4.同样的方法制作一个蘑菇的开始按钮:同时在前面板导入背景 图片“ 玛丼投 球”自定义控键和实例的关联关系:如果选择了自定义类型 或者严 格自定 义类型 ,那么创建的控键将和使用该控
发表于 01-07 10:57
【HarmonyOS HiSpark AI Camera试用连载 】自定义Shell命令编程实例
本帖最后由 :‖Lin... 于 2021-1-10 22:13 编辑
上一篇我们介绍了一下在HarmonyOS中常用的一些shell命令,接下来我们将就如何自定义一个shell命令进行讲述
发表于 01-10 02:30
讲解一下HarmonyOS中的几个自定义组件用到的知识
HarmonyOS 的 Component 组件对外提供了一个 DrawTask 接口,通过 addDrawTask 方法为组件添加一个 DrawTask,让开发者可以进行自定义绘制逻辑。首先我们
发表于 03-16 16:05
OpenHarmony应用开发之自定义弹窗
。
aboutToAppear参考文档:自定义组件的生命周期-组件参考(基于ArkTS的声明式开发范式)-ArkTS API参考-HarmonyOS应用开发
实现builder
发表于 09-06 14:40
HarmonyOS 中的几个自定义控件介绍
HarmonyOS 开发自定义组件目前还不是很丰富,在开发过程中常常会有一些特殊效果的组件,这就需要我们额外花一些时间实现。
自定义视图组件教程案例
自定义组件 1.自定义组件-particles(粒子效果) 2.自定义组件- pulse(脉冲button效果) 3.自定义组件-progress(progress效果) 4.
发表于 04-08 10:48
•14次下载
自定义算子开发
一个完整的自定义算子应用过程包括注册算子、算子实现、含自定义算子模型转换和运行含自定义op模型四个阶段。在大多数情况下,您的模型应该可以通过使用hb_mapper工具完成转换并顺利部署到地平线芯片上……
鸿蒙ArkUI实例:【自定义组件】
组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下
评论