HarmonyOS开发案例:【购物APP】
创始人
2024-11-13 05:05:06
0

介绍

本篇Codelab使用常用组件、页面路由router实现购物应用,包含以下功能:

  1. 使用toolbar、toolbar-item组件实现“首页”,“新品”,“购物车”,“我的”页面切换。
  2. 使用list组件,展示购物车里的商品。
  3. 使用swiper组件,实现图片自动轮播。
  4. 使用panel组件,展示商品规格。
  5. 使用自定义组件,提高代码的可读性。

相关概念

  • [swiper]:滑动容器,提供切换子组件显示的能力。
  • [input]:交互式组件,包括单选框,多选框,按钮和单行文本输入框。
  • [search]:搜索框组件,用于提供用户搜索内容的输入区域。
  • [toolbar]:工具栏。放在界面底部,用于展示针对当前界面的操作选项。
  • [toolbar-item]:工具栏[toolbar]子组件。 用于展示工具栏上的一个操作选项。
  • [自定义组件]:自定义组件是用户根据业务需求,将已有的组件组合,封装成的新组件,可以在工程中多次调用,从而提高代码的可读性。

环境搭建

软件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release及以上版本。
  • OpenHarmony SDK版本:API version 9及以上版本。

硬件要求

  • 开发板类型:[润和RK3568开发板]。
  • OpenHarmony系统:3.2 Release及以上版本。

环境搭建

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. [获取OpenHarmony系统版本]:标准系统解决方案(二进制)。以3.2 Release版本为例:

  2. 搭建烧录环境。

    1. [完成DevEco Device Tool的安装]
    2. [完成RK3568开发板的烧录]
  3. 搭建开发环境。

    1. 开始前请参考[工具准备],完成DevEco Studio的安装和开发环境配置。
    2. 开发环境配置完成后,请参考[使用工程向导]创建工程(模板选择“Empty Ability”)。
    3. 工程创建完成后,选择使用[真机进行调测]。
    4. 鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

搜狗高速浏览器截图20240326151450.png

代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在【gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md】中提供。由于本篇Codelab页面较多,因此component和pages目录下只展示“购物主页面”的hml、js、css。

`HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`  ├──entry/src/main/js	             // 代码区 │  └──MainAbility │     ├──common │     │  ├──constant │     │  │  └──commonConstants.js    // 公共常量类 │     │  └──images                   // 图片区 │     ├──component │     │  ├──backComponent            // 后退子组件 │     │  ├──commonButton             // 支付按钮子组件 │     │  ├──commonToolbar            // 导航栏子组件 │     │  ├──home                     // 购物主页子组件 │     │  ├──likedCards               // 猜你喜欢卡片子组件 │     │  ├──myInfo                   // 我的子组件 │     │  ├──newProduct               // 新品子组件 │     │  ├──orderReusableCom         // 用户商品信息子组件 │     │  ├──productBuyInfo           // 购买商品卡片子组件 │     │  ├──shoppingCart             // 购物车子组件 │     │  └──subtitle                 // 副标题子组件 │     ├──i18n │     │  ├──en-US.json               // 英文国际化			 │     │  └──zh-CN.json               // 中文国际化	 │     ├──pages │     │  ├──allOrders                // 全部订单页 │     │  ├──homePage                 // 购物主页 │     │  │  ├──homePage.css          // 购物主页面样式 │     │  │  ├──homePage.hml          // 购物主页面 │     │  │  └──homePage.js           // 购物主页面逻辑 │     │  ├──launchPage               // 启动页 │     │  ├──pendingPayment           // 待支付页 │     │  ├──productDetails           // 产品详情页 │     │  └──sureOrder                // 确定订单页 │     └──app.js                      // 程序入口 └──entry/src/main/resources          // 应用资源目录 

构建购物应用首页

本篇Codelab选取购物应用的主页面、购物车页面、以及导航栏进行详细的讲解,对于完整代码,可在gitee源码中进行查看。

购物应用的主页面主要由界面底部导航栏和导航栏上的内容组成。效果如图所示:

       
{ tag === homePageIndex }}"> { tag === newProductIndex }}"> { tag === shoppingCartIndex }}"> { tag === myInfoIndex }}"> { tag }}" @switch-toolbar="switchToolbar">

底部导航栏:由“主页”、“新品”、“购物车”以及“我的”页面组成,点击导航栏内容,展示所点击模块的内容。

// homePage.js import CommonConstants from '../../common/constant/commonConstants';  export default {   data: {     // 页面默认展示主页,tag是主页面的索引     tag: 1,     // 主页面索引     homePageIndex: CommonConstants.HOME_PAGE_INDEX,     // 新品页面索引     newProductIndex: CommonConstants.NEW_PRODUCT_INDEX,     // 购物车页面索引     shoppingCartIndex: CommonConstants.SHOPPING_CART_INDEX,     // 我的页面索引     myInfoIndex: CommonConstants.MY_INFO_INDEX   },    /**    * 切换导航栏内容    *    * @param value 子组件传过来的索引    */   switchToolbar(value) {     this.tag = value.detail.index;   } } 

子组件:导航栏的使用

导航栏由“主页”、“新品”、“购物车”以及“我的”组成,点击导航栏对应的子组件,页面会展示对应模块的内容。效果如图所示:

在父组件homePage.hml中使用@switch-toolbar="switchToolbar"绑定子组件的事件,用于接收子组件传过来的索引,通过if判断,从而展示索引对应的页面。

 ... 
{ tag === homePageIndex }}"> { tag === newProductIndex }}"> { tag === shoppingCartIndex }}"> { tag === myInfoIndex }}"> { tag }}" @switch-toolbar="switchToolbar">
{ $t(toolbarName.home) }}" @click="switchToolbar(homePageIndex)" icon="{{ tag === homePageIndex ? commonIcon.home : commonIcon.homeDisable }}"> { $t(toolbarName.newProduct) }}" @click="switchToolbar(newProductIndex)" icon="{{ tag === newProductIndex ? commonIcon.newProduct : commonIcon.newProductDisable }}"> { $t(toolbarName.shoppingCart) }}" @click="switchToolbar(shoppingCartIndex)" icon="{{ tag === shoppingCartIndex ? commonIcon.shoppingCart : commonIcon.shoppingCartDisable }}"> { $t(toolbarName.me) }}" @click="switchToolbar(myInfoIndex)" icon="{{ tag === myInfoIndex ? commonIcon.me : commonIcon.meDisable }}">

在子组件commonToolbar.js中通过this.$emit(‘switchToolbar’, {info: value})触发事件并向上传递参数,homePage.js中的switchToolbar方法接收子组件传过来的索引。在子组件commonToolbar.js文件中定义props,props用于组件之间的数据通信,当父组件中的tag发生变化的时候,子组件也会随之响应,然后改变toolbar-item中icon的颜色。

// homePage.js import CommonConstants from '../../common/constant/commonConstants';  export default {   data: {     // 页面默认展示主页,tag是主页面的索引     tag: 1,     ...   },    /**    * 切换导航栏内容    *    * @param value 子组件传过来的索引    */   switchToolbar(value) {     this.tag = value.detail.index;   } }  // commonToolbar.js import CommonConstants from '../../common/constant/commonConstants';  export default {   props: ['tag'],   data: {     commonIcon: CommonConstants.COMMON_TOOLBAR_ICON,     toolbarName: CommonConstants.COMMON_TOOLBAR_NAME,     // 主页面索引     homePageIndex: CommonConstants.HOME_PAGE_INDEX,     // 新品页面索引     newProductIndex: CommonConstants.NEW_PRODUCT_INDEX,     // 购物车页面索引     shoppingCartIndex: CommonConstants.SHOPPING_CART_INDEX,     // 我的页面索引     myInfoIndex: CommonConstants.MY_INFO_INDEX   },    /**    * 向父组件传值    *    * @param index 选中子模块的索引    */   switchToolbar(index) {     this.$emit('switchToolbar', {       index: index     });   } } 

构建购物车页面

购物车页面由顶部标题栏、购物车商品列表、猜你喜欢的商品列表三部分组成,并以子组件的形式显示在主页面中。其中,购物车商品列表使用list组件和for循环,实现对多条商品数据进行展示。猜你喜欢的商品列表是通过引用自定义组件实现的。效果如图所示:

在这里插入图片描述

   
{{ $t('strings.shopping_cart') }} {{ $t('strings.edit') }}
{ isAllSelect }}" @change="checkboxOnChange"> { person }}"> {{ $t('strings.mall_self_operated') }}
{ (index, item) in shoppingListData }}" class="list-item">
{ item.isSelect }}"> { item.image }}">
{{ $t(item.title) }} {{ $t(item.subtitle) }}
{{ item.price }}
{ item.num === 0 ? commonIcon.decreaseDisableIcon : commonIcon.decreaseIcon }}"> {{ item.num }} { commonIcon.increaseIcon }}" @click="addNum(index)">
  • 点击“商品自营”头像前的多选框,会触发checkboxOnChange()方法,页面会勾选/不勾选购物车的中所有商品。
  • 点击“+”按钮会触发addNum()方法,增加单件商品的数量。
  • 点击“-”按钮会触发subtractNum()方法,减少单件商品的数量。
// shoppingCart.js import CommonConstants from '../../common/constant/commonConstants';  export default {   data: {     isAllSelect: false,     shoppingListData: CommonConstants.SHOPPING_LIST_DATA,     commonIcon: CommonConstants.SHOPPING_CART_ICON,     person: CommonConstants.COMMON_ICON.person   },    /**    * 购物车商品全选/非全选    */   checkboxOnChange() {     this.isAllSelect = !this.isAllSelect;     this.shoppingListData.filter((item) => {       item.isSelect = this.isAllSelect;     });   },    /**    * 勾选单个商品    *    * @param subscript 选中商品的索引    * @param event 单选框事件    */   singleAnswer(subscript, event) {     // 修改商品的选择状态     this.shoppingListData.forEach((item, index) => {       if (index === subscript) {         item.isSelect = event.checked;       }     })     // 检查购物车中的所有商品是否都被选中     let selectAll = this.shoppingListData.every(item => item.isSelect === true);     if (selectAll === true) {       this.isAllSelect = true;     } else {       this.isAllSelect = false;     }   },    /**    * 减少商品数量逻辑    *    * @param value 当前商品的数量    */   subtractNum(value) {     if (this.shoppingListData[value].num > 0) {       this.shoppingListData[value].num--;     }   },    /**    * 增加商品数量逻辑    *    * @param value 当前商品的数量    */   addNum(value) {     this.shoppingListData[value].num++;   } } 

相关内容

热门资讯

aapoker俱乐部(智星德州... aapoker俱乐部(智星德州扑克)wepoke德扑之星(透视辅助)总是真的有挂(有挂下载)-小红书...
一分钟掌握!微扑克有辅助插件(... 一分钟掌握!微扑克有辅助插件(黑科技)外挂透明挂辅助神器(2020已更新)(百度知乎)微扑克有辅助插...
透视辅助挂!德扑ai助手&qu... 透视辅助挂!德扑ai助手"wpk有"的确是有挂的(有挂代打)-知乎德扑ai助手软件透明挂微扑克wpk...
透明辅助(菠萝德州)外挂软件透... 透明辅助(菠萝德州)外挂软件透明插件(辅助挂)一贯真的有挂(2023已更新)(哔哩哔哩);1.菠萝德...
aapoker俱乐部(微扑克)... aapoker俱乐部(微扑克)德扑ai助手软件(黑科技)其实真的有挂(有挂打法)-百度1、任何微扑克...
黑科技辅助挂!德扑之星猫腻&q... 黑科技辅助挂!德扑之星猫腻"来玩德州app外挂"本来真的有挂(有挂私人房)-头条来玩德州app外挂辅...
3分钟普及!微扑克这软件有问题... 3分钟普及!微扑克这软件有问题(辅助挂)外挂透明挂辅助脚本(2024已更新)(知乎)1、完成微扑克这...
德州辅助(aApoker)外挂... 德州辅助(aApoker)外挂软件透明软件(智能ai代打)本来真的有挂(2021已更新)(知乎);1...
德扑之星有猫腻(德州竞技联盟)... 德扑之星有猫腻(德州竞技联盟)德州ai人工智能(透视)其实真的有挂(有挂俱乐部)-微博热搜1、让任何...
透视辅助!aapoker辅助工... 透视辅助!aapoker辅助工具"wpk辅助软件查得出来"果真真的有挂(有挂黑科技)-今日头条wpk...