【HarmonyOS】体验鸿蒙电商平台的未来之旅!

           从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是什么?鸿蒙仅仅是一个手机操作系统吗?它的出现能够和Android和IOS三分天下吗?它未来的潜力能否制霸整个手机市场呢?

今天实现一个简单的小案例,从零开始讲解如何通过鸿蒙开发实现一个电商平台的案例。

目录

新建项目

登录页面

点击登录

个人中心

首页搭建

Tabs组件


新建项目

首先我们先打开DevEco Studio,点击新建项目:

然后根据自己的情况选择应用,这里我们选择空的 Empty Ability 进行创建:

然后接下来输入自己的项目名称就行,点击finish即可:

运行本地预览器,可以看到我们的初始项目已经跑通:

登录页面

登录页面的构建很简单,我们参考网上的登录页面,简单的构建一下登录页面的画面,这里我使用的图标都是来自阿里云图标库当中,大家可以根据自己的情况在网上寻找资源来构建画面,闲话少说我们直接开始,首先我们在pages文件夹下新建arkts文件Login文件,当作是我们的登录页面,接下来我们开始正式编写相关代码:

因为构建静态页面很简单,也没有什么好讲的,这里我就将静态页面的源代码直接共享出来吧,大家可以自己看一下:

// 登录页面// 文本框样式
@Extend(TextInput) function InputStyle() {.placeholderColor('#ff5d7e9d').height(60).fontSize(20).backgroundColor('#ccc').width('90%').padding({ left: 15 }).maxLength(10)
}// 分割线
@Extend(Line) function liseStyle() {.width('100%').height(2).backgroundColor('#efefef').margin({ top: 10, bottom: 10 })
}// Text组件的蓝色文本样式
@Extend(Text) function blueTextStyle() {.fontColor('#ff084d85').fontSize(15).fontWeight(FontWeight.Bold)
}@Entry
@Component
struct Login {@State account: string = '' // 登录账号@State password: string = '' // 登录密码@State isShowProgress: boolean = true // 是否显示登录的进度条// 构建登录按钮@Builder imageButton(image: Resource) {// 构建按钮图片,本质上就是在按钮里面增加一个image组件Button({ type: ButtonType.Circle, stateEffect: true }){ // 圆形按钮,按下按钮有切换颜色效果Image(image)}.height(50).width(50).backgroundColor('#fff')}build() {Column() { // 登录界面的布局Image($r('app.media.login_logo')) // Logo图片.width($r('app.float.logo_image_size')).height($r('app.float.logo_image_size')).margin({top: $r('app.float.logo_margin_top'),bottom: $r('app.float.logo_margin_bottom')})// 登录标题Text($r('app.string.login_page')).fontSize($r('app.float.page_title_text_size')).fontWeight(FontWeight.Medium).fontColor($r('app.color.page_title_text_color'))// 小标题Text('登录账号以获取更多服务').fontSize(20).fontColor('#ccc').margin({ top: 15, bottom: 25 })// 账号输入框TextInput({ placeholder: '请输入账号' }).InputStyle().type(InputType.Number) // 文本行中只能输入数字.onChange((value: string) => {this.account = value})Line().liseStyle()// 密码输入框TextInput({ placeholder: '请输入密码' }).InputStyle().type(InputType.Password).onChange((value: string) => {this.password = value})Line().liseStyle()// 短信提示与验证码Row(){Text('短信验证码登录').blueTextStyle()Text('忘记密码').blueTextStyle()}.width('100%').justifyContent(FlexAlign.SpaceBetween).padding({ left: 12, right: 12 })// 登录按钮Button('登录', { type: ButtonType.Capsule }).width('75%').height(45).fontSize(20).fontWeight(FontWeight.Bold).margin({ top: 60, bottom: 20 }).onClick(() => {// 登录事件})// 注册账号文本Text('注册账号').fontColor('blue').fontSize(15).fontWeight(FontWeight.Medium)// 是否显示进度条if (this.isShowProgress){LoadingProgress().color('red').width(40).height(40).margin({ top: 10 })}// 其他方式登录Text('其他方式登录').fontColor('#ff776f6f').fontSize(18).fontWeight(FontWeight.Medium).margin({ top: 5, bottom: 10 })// 三种登录方式Row({ space: 40 }){this.imageButton($r("app.media.wx"))this.imageButton($r("app.media.tb"))this.imageButton($r('app.media.qq'))}}.width('100%').height('100%')}
}

最终呈现的效果如下:

关于这个静态页面的构建我简单提一下,对于公共常用的样式,我们可以将其书写在静态资源base当中然后进行调用即可,上文的代码我进行了简单的使用,主要的方式如下:

点击登录

接下来我们给我们静态页面的登录按钮设置点击事件进行登录操作,以及对进度条的显示进行一个设置,当点击登录和进入到正式页面之间的间隔中进行显示这个进度条出来,闲话少说正式开始:

@State isShowProgress: boolean = false // 是否显示登录的进度条
private timeOutId: number = -1 // 控制登录超时的时间变量// 登录回调事件
Login(): void {if(this.account === '' || this.password === ''){promptAction.showToast({ // 开启一个确认弹层message: '账号密码为空,请重新输入!'})} else {this.isShowProgress = trueif(this.timeOutId == -1) {this.timeOutId = setTimeout(() => {// 2秒之后执行的函数this.isShowProgress = falsethis.timeOutId = -1// 页面跳转}, 2000)}}
}

然后我们在离开页面的时候,对定时器进行一个清除:

// 离开页面要取消定时器
aboutToDisappear() {clearTimeout(this.timeOutId)this.timeOutId = -1
}

实现的效果如下:

接下来我们开始实现点击登录按钮后,触发点击事件进行页面的路由跳转,代码如下,关于个人中心页面的搭建,可以继续看下一个标题的内容:

个人中心

接下来开始实现个人中心的页面,个人中心的页面搭建其实也非常简单,这里我们把要存放的图片和相关标题的内容单独抽离出去,形成一个新的类,来获取静态资源,后面需求页面要使用的时候直接调用就可以了,具体代码如下:

interface ItemData {title: string;imagePath: Resource;switch?: boolean;
}export class DataModel {// 获取列表数据getSettingListData(): ItemData[] {let settingListData: ItemData[] = [{title: '推送通知',imagePath: $r('app.media.1'),switch: true,},{title: '数据管理',imagePath: $r('app.media.2'),switch: false,},{title: '菜单设置',imagePath: $r('app.media.3'),switch: false,},{title: '关于个人',imagePath: $r('app.media.4'),switch: false,},{title: '清除缓存',imagePath: $r('app.media.5'),switch: false,},{title: '隐私协议',imagePath: $r('app.media.6'),switch: false,},];return settingListData;}
}export default new DataModel();

关于这些静态资源的图片可以到阿里云图标库上寻找,这里就不再赘述了:

然后接下来我们需要开始正式的书写我们的个人中心页面的代码了,具体静态页面代码如下:

import router from '@ohos.router'
import DataModel from '../../components/DataModel'
import promptAction from '@ohos.promptAction'// 设置界面
@Entry
@Component
struct MySettings {@State account: number = 0onPageShow(){let acc = router.getParams() as Record<string, number>if (acc) {this.account = acc['sendMsg']}}// 构建设置单元格函数@Builder settingCell(item) {Row(){Row({ space: 10 }) {Image(item.imagePath).width(38).height(38)Text(item.title).fontSize(25)}// 判断switch是否为trueif(!item.switch) {Image($r('app.media.arrow_right')).width(30).height(30)} else {Toggle({ type: ToggleType.Switch, isOn: false }) // 显示一个开关组件}}.justifyContent(FlexAlign.SpaceBetween).width('100%').padding({ left: 15, right: 15 })}build() {Scroll(){Column({ space: 12 }){Column(){ // 创建一个内嵌的列布局Text('个人中心').fontWeight(FontWeight.Bold).fontSize(40).margin({ top: 10 }).padding({ left: 15 })}.width('100%').alignItems(HorizontalAlign.Start)// 账户布局Row(){Image($r('app.media.account')).width(60).height(60)Column(){Text('张三').fontSize(25)Text(`${this.account.toString()}@163.com`).fontSize(15).margin({ top: 8 })}.layoutWeight(2).alignItems(HorizontalAlign.Start).margin({ left: 30 })}.width('100%').height(70).backgroundColor(Color.White).padding({ left: 20, right: 20 }).borderRadius(20).margin({ top: 30 }).alignItems(VerticalAlign.Center)// 列表布局List(){ForEach(DataModel.getSettingListData(), (item, index) => {ListItem(){this.settingCell(item)}.onClick(() => {promptAction.showDialog({message: `第${index + 1}功能:${item.title},还未完成,尽情期待!`})}).height(60)})}.backgroundColor(Color.White).width('100%').divider({strokeWidth: 1, // 设置分割线的高度color: Color.Gray, // 设置分割线的颜色startMargin: 15, // 设分割线的起始边距endMargin: 15 // 设置分割线的结束边距}).borderRadius(30).padding({ top: 15, bottom: 20 })Blank()// 退出按钮的布局Button('退出登录', { type: ButtonType.Capsule }).width('90%').height(50).fontSize(20).fontColor('red').backgroundColor('#ccc').margin({ bottom: 15 })}.height('100%')}.width('100%').height('100%')}
}

呈现的效果如下所示:

然后接下来我们给退出登录的按钮设置点击事件:

首页搭建

接下来开始实现首页的页面搭建,静态页面的搭建其实很简单,博主也没有什么好讲的说实话,无非就是Grid布局以及Swiper布局的排版一下注意一点就可以了,ok接下来我们开始给出具体代码吧:

import DataModel from '../../components/DataModel'// 首页
@Entry
@Component
struct Home {private swiperController: SwiperController = new SwiperController() // 轮播控制器实例build() {Scroll(){Column({ space: 10 }){Column(){ // 标题Text('首页').fontWeight(FontWeight.Bold).fontSize(30).margin({ top: 10 }).padding({ left: 10 })}.width('100%').alignItems(HorizontalAlign.Start)// 轮播图片Swiper(this.swiperController){ForEach(DataModel.getSwiperImage(), (item) => {// 构建每一张图片Image(item.imagePath).width('100%').height(250).borderRadius(50)})}.autoPlay(true) // 轮播图自动播放.margin({ top: 15 })// 菜单列表Grid(){ForEach(DataModel.getFirstGridData(), (item) => {GridItem(){Column(){Image(item.imagePath).width(40).height(40)Text(item.title).fontSize(15).margin({ top: 5 })}}})}.columnsTemplate('1fr 1fr 1fr 1fr') // 设置网格的列模板,每列平分空间.rowsTemplate('1fr 1fr') // 设置网格的行模板,每行平分空间.columnsGap(10).rowsGap(10).padding({ top: 10, bottom: 10 }).height(200).backgroundColor(Color.White).borderRadius(50)// 频道列表Text('列表').fontSize(20).fontWeight(FontWeight.Bold).width('100%').margin({ top: 15 })Grid(){ForEach(DataModel.getSecondGridData(), (item) => {GridItem() {Column() {Text(item.title).fontSize(20).fontWeight(FontWeight.Medium)Text(item.describe).fontSize(15).fontColor('#ccc').margin({ top: 5 })}.alignItems(HorizontalAlign.Start) // 两个文本框在水平方向居左对齐}.padding({ top: 15, left: 10 }).borderRadius(10).align(Alignment.TopStart) // 设置网格项对齐方式为顶部对齐.backgroundImage(item.imagePath) // 设置网格项背景图像.backgroundImageSize(ImageSize.Cover) // 设置背景图像尺寸模式为覆盖.width('100%').height('100%')})}.width('100%').height(300).columnsTemplate('1fr 1fr').rowsTemplate('1fr 1fr') // 设置网格的行列模板.columnsGap(10).rowsGap(10).margin({ bottom: 15 })}}.height('100%')}
}

最终呈现的效果如下:

Tabs组件

ArkUI开发框架提供了一种页签容器标签Tabs,开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器 Tabs 的形式多种多样,不同的页面设计页签不一样,可以把页签设置在底部、顶部或者侧边。

接下来我们创建页面组件index,然后在页面组件当中书写tab页面:

import Home from './Home'
import MySettings from './MySettings'
import router from '@ohos.router'// app主页,页面组件
@Entry
@Component
struct Index {@State currentIndex: number = 0 // 当前默认的页签索引号private account: numberprivate tabsController: TabsController = new TabsController()// 接收路由参数onPageShow(){let acc = router.getParams() as Record<string, number>if (acc) {this.account = acc['sendMsg']}}// 自定义Tabs函数@Builder TabBuilder(title: string, index: number, selectedImg: Resource, normalImg: Resource) {Column() {Image(this.currentIndex == index ? selectedImg : normalImg).width(30).height(30)Text(title).margin({ top: 5 }).fontSize(15).fontColor(this.currentIndex == index ? '#008c8c' : '#ccc')}.justifyContent(FlexAlign.Center).width('100%').height('50').onClick(() => {this.currentIndex = indexthis.tabsController.changeIndex(this.currentIndex) // 修改页签的索引})}build() {Tabs({barPosition: BarPosition.End, // 页签底部展示controller: this.tabsController // 页签容器的控制}){ // 标签容器// 首页TabContent(){Home()}.padding({ left: 20, right: 20 }).backgroundColor('#ccc').tabBar(this.TabBuilder('首页', 0, $r('app.media.home_active'), $r('app.media.home')))// 个人中心TabContent(){MySettings({ account: this.account })}.padding({ left: 20, right: 20 }).backgroundColor('#ccc').tabBar(this.TabBuilder('我的', 1, $r('app.media.my_active'), $r('app.media.my')))}.animationDuration(0) // 去掉切换页面的动画效果.scrollable(false) // 去掉滑动效果,只能点击按钮切换界面.width('100%').backgroundColor(Color.White).barHeight(50).barMode(BarMode.Fixed)}
}

这里我们需要将之前的Home页面以及MySettings页面进行一个暴露出去:

这里简单提一下,当用户点击登录按钮之后,这里我们需要跳转到index页面的,所以携带的路由参数也是先传递给index页面,然后index页面再传递给子组件MySettings组件当中,这里注意一下:

最终呈现的效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 的提示符太长了,帮你精简一下

普通用户修改文件 ~/.bashrc 修改 50 行左右的代码&#xff0c;将两个w改为大写的W 如果是root用户则修改文件/root/.bashrc&#xff0c;同样的方法。

接口自动化测试框架设计

文章目录 接口测试的定义接口测试的意义接口测试的测试用例设计接口测试的测试用例设计方法postman主要功能请求体分类JSON数据类型postman内置参数postman变量全局变量环境变量 postman断言JSON提取器正则表达式提取器Cookie提取器postman加密接口签名 接口自动化测试基础getp…

从 fatal 错误到 sync.Map:Go中 Map 的并发策略

为什么 Go 语言在多个 goroutine 同时访问和修改同一个 map 时&#xff0c;会报出 fatal 错误而不是 panic&#xff1f;我们该如何应对 map 的数据竞争问题呢&#xff1f; 这篇文章将带你一步步了解背后的原理&#xff0c;并引出解决 map 并发问题的方案。 Map 数据竞争 首先…

node介绍

1.node是什么 Node是一个基于Chrome V8引擎的JS运行环境。 Node不是一个独立的语言、node不是JS框架。 Node是一个除了浏览器之外的、可以让JS运行的环境 Node.js是一个让JS运行在服务端的开发平台&#xff0c;是使用事件驱动&#xff0c;异步非阻塞I/O&#xff0c;单线程&…

【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲

Undertow web容器的入门实战及调优方案精讲 Undertow web容器Undertow 介绍官网API给出一句话概述Undertow&#xff1a;官网API总结特点&#xff1a;Lightweight&#xff08;轻量级&#xff09;HTTP Upgrade Support&#xff08;支持http升级&#xff09;、HTTP/2 Support支持H…

提升网站关键词排名的工具

随着互联网的蓬勃发展&#xff0c;网站的关键词排名成为衡量网站流量和曝光度的重要指标。在这个竞争激烈的数字时代&#xff0c;站在搜索引擎结果的前列变得至关重要。为了实现这一目标&#xff0c;合理利用关键词排名优化工具是必不可少的。本文将重点介绍147SEO软件&#xf…

《WebKit 技术内幕》之八(1):硬件加速机制

《WebKit 技术内幕》之八&#xff08;1&#xff09;&#xff1a;硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页&#xff0c;因为GPU的作用主要是用来绘制3D图形并且性能特别好&#xff0c;这是它的专长所在&#xff0c;它…

腾讯云tsf平台-部署微服务项目

腾讯云tsf平台-部署微服务项目 一、腾讯云tsf平台简介二、部署准备0&#xff08;数据库、中间件等部署&#xff09;三、部署准备1&#xff08;创建集群和命名空间&#xff09;1、准备部署资源--集群2、使用容器部署微服务步骤 1&#xff1a;创建容器集群步骤 2&#xff1a;创建…

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

计算机网络——运输层(2)暨小程送书

计算机网络——运输层&#xff08;2&#xff09;暨小程送书 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 运输层&#xff08;2&#xff09;TCP/IP对比TCP&#xff08;传输控制协议&#xff09;&#xff1a;IP&#xff08;互联网协议&#xff09;&#xff1a;总结 拥塞…

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍

目录 一.初识Linux 1.操作系统概述 计算机组成 硬件&#xff1a; 软件&#xff1a; 操作系统&#xff1a; 操作系统工作流程 操作系统作用 常见的操作系统 PC端&#xff1a; 移动端&#xff1a;&#xff08;掌上操作系统&#xff09; 一.初识Linux 2.Linux初识 linu…

【微信小程序独立开发 5】后端搭建联调

前言&#xff1a;上节我们完成了个人信息页的编写&#xff0c;本节完成将个人信息发给后端&#xff0c;并由后端存储 创建Spring Boot项目 配置maven仓库 使用自己下载的maven版本 添加pom文件 <dependencies><dependency><groupId>org.springframework.boo…

【服务器】Xshell与Xftp软件的使用指南

目录 【Xshell软件】 1.1 Xshell软件的功能 1.2 Xshell软件的使用 【Xftp软件】 2.1 Xftp软件的功能 2.2 Xftp软件的使用 可替代产品【FinalShell】 3.1 FinalShell软件的使用 3.2 FinalShell连接服务器失败解决方法 可替代产品【FileZilla】

Java网络编程——UDP通信原理

一、TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCPUDP协议名称传输控制协议用户数据包协议是否连接面向连接的协议。数据必须要建立连接无连接的协议&#xff0c;每个数据报中都给出完整的地址信息&#xff0c;因此不需要事先建立发送方和接受方的连接是…

Java面试题50道

文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…

toad 库中 iv 计算逻辑

merge 函数默认为决策树合并 决策树叶子结点默认值DEFAULT_BINS 10&#xff0c;可通过 n_bins 人为设置叶子结点数

Eureka整合seata分布式事务

文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点&#xff1a;5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…

19万9的小米SU7已经彻底被否了

文 | AUTO芯球 作者 | 李诞 雷总 您是真不听劝啊 还要准备和米粉“干一架”啊 我和大家一样啊 这下好了 19万9的小米SU7已经彻底被否了 说实话 我心理真不是滋味 毕竟大家都说了&#xff0c; 9.9是雷爹&#xff0c;9万9是雷帝&#xff0c;15w是雷神 19万是雷总&#x…

Java开发工具:IntelliJ IDEA 2023 for Mac中文激活

IntelliJ IDEA 2023是一款由JetBrains开发的强大的集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;适用于多个编程语言。它旨在提高开发人员的生产力和代码质量。 软件下载&#xff1a;Java开发工具&#xff1a;IntelliJ IDEA 2023 for Mac中文激活 IntelliJ IDEA 20…

[Java面试]JavaSE知识回顾

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Java面试中JavaSE中会涉及到的知识点 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x…