当前位置: 首页 > news >正文

【HarmonyOS】HarmonyOS NEXT学习日记:五、交互与状态管理

【HarmonyOS】HarmonyOS NEXT学习日记:五、交互与状态管理

在之前我们已经学习了页面布局相关的知识,绘制静态页面已经问题不大。那么今天来学习一下如何让页面动起来、并且结合所学完成一个代码实例。

交互

如果是为移动端开发应用,那么交互上用的最多的就是触屏事件。当然ArkUI也提供了键鼠事件、焦点事件、拖拽事件等。不过我认为用到的时候再看文档就行,事件这个东西一通百通,所以这里只介绍几个常用的事件。

onClick

点击事件是指通过手指或手写笔做出一次完整的按下和抬起动作。当发生点击事件时,会触发以下回调函数

用法:onClick(event: (event?: ClickEvent) => void)

event参数提供点击事件相对于窗口或组件的坐标位置,以及发生点击的事件源

我们写一个示例,点击按钮操作一个数字

  @State num: number = 0build() {Column({space: 10}){Text(`数字:${this.num}`)Button('数字+1').onClick(()=>{this.num++})Button('数字-1').onClick(()=>{this.num--})}.width('100%').alignItems(HorizontalAlign.Center)}

在这里插入图片描述
点击数字+1按钮则数字变大1
在这里插入图片描述

触摸事件

当手指或手写笔在组件上触碰时,会触发不同动作所对应的事件响应,包括按下(Down)、滑动(Move)、抬起(Up)事件

用法:onTouch(event: (event?: TouchEvent) => void)

  • event.type为TouchType.Down:表示手指按下。
  • event.type为TouchType.Up:表示手指抬起。
  • event.type为TouchType.Move:表示手指按住移动。
@State eventType: string = ''build() {Column({space: 10}){Text(`eventType:${this.eventType}`)Button('触摸我').onTouch((event) => {if(event) {if (event.type === TouchType.Down) {this.eventType = 'Down';}if (event.type === TouchType.Up) {this.eventType = 'Up';}if (event.type === TouchType.Move) {this.eventType = 'Move';}}})}.width('100%').alignItems(HorizontalAlign.Center)}

在这里插入图片描述
手在按钮上按下时
在这里插入图片描述
手在按钮上移动时
在这里插入图片描述
手松开按钮后
在这里插入图片描述

状态管理

但如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念。
事实上之前我们已经多次用到了这个概念,点击按钮改变一个字符串并让他展示在页面上,这个字符串就是一个状态。

即:点击交互触发了文本状态变更,状态变更引起了UI渲染

我们将写组件时用到的变量分为以下两种

  • 普通变量:只能在初始化时渲染,后续将不会再刷新。
  • 状态变量:需要装饰器装饰,改变会引起 UI 的渲染刷新 (必须设置类型 和初始值)

不论是哪种变量,只要是定义在组件内,在使用的时候,都需要通过 this 访问。


@Entry
@Component
struct Index {@State str1: string = 'str1'str2: string = 'str2'build() {Column() {Text(this.str1)Text(this.str2)}}
}

实践-购物车

结合前面学的布局知识,和今天的交互、状态管理实现一个移动端商城的购物车。可以点击商品的+、-来为购物车添加商品。

interface Commodity {img: Resource,name: string,introduce: string,oldPrice: number,price: number,num: number,
}@Entry
@Component
struct Index {@State Dog:Commodity={img: $r('app.media.test2'), // 商品图片资源name: '狗头', // 商品名称introduce: '这是一个滑稽的狗头', // 商品介绍oldPrice: 99, // 商品原价price: 9.9, // 商品现价num: 0, // 商品数量}build() {Column() {// 滚动视图Scroll(){Row(){// 商品图片Image(this.Dog.img).size({width: 120,height: 80}).borderRadius(10).margin({right: 10})// 商品信息列Column(){// 商品名称Row(){Text(this.Dog.name).fontSize(18).fontColor('#333')}// 商品介绍Row(){Text(this.Dog.introduce).fontSize(16).fontColor('#aaa').lineHeight(30)}// 商品价格与操作Row(){Text(`${this.Dog.price}`).fontSize(22).fontWeight(FontWeight.Bold).fontColor(Color.Red)Text(`${this.Dog.oldPrice}`).fontSize(18).fontColor('#999').margin({left: 10}).decoration({type: TextDecorationType.LineThrough})// 增加商品数量按钮Text('+').width(15).height(20).margin({left:30}).border({width: 1,color: '#aaa',style: BorderStyle.Solid,radius: {topLeft:3,bottomLeft:3}}).fontColor('#333').fontSize(16).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center).onClick(()=>{this.Dog.num++})// 显示商品数量Text(this.Dog.num+'').height(20).border({width: 1,color: '#aaa',style: BorderStyle.Solid,}).padding({left: 5,right: 5})// 减少商品数量按钮Text('-').width(15).height(20).border({width: 1,color: '#aaa',style: BorderStyle.Solid,radius: {topRight:3,bottomRight:3}}).fontColor('#333').fontSize(16).fontWeight(FontWeight.Bold).textAlign(TextAlign.Center).onClick(()=>{if(this.Dog.num >= 1)this.Dog.num--})}}.alignItems(HorizontalAlign.Start).layoutWeight(1) // 设置列布局的权重}.alignItems(VerticalAlign.Top).width('100%').backgroundColor('#ddd').padding(20)}.backgroundColor('#eee').align(Alignment.Top).layoutWeight(1) // 设置滚动视图的布局权重// 底部结算栏Row(){Column(){// 选购数量与总价Row(){Text(`已选${this.Dog.num}}件,`).fontColor('#666')Text('合计:')Text(`${this.Dog.num * this.Dog.price}`).fontColor(Color.Red)}// 显示优惠金额Row(){Text(`共减¥${(this.Dog.oldPrice - this.Dog.price) * this.Dog.num}`).fontSize(14).lineHeight(18).fontColor(Color.Red)}}.alignItems(HorizontalAlign.End).layoutWeight(1)// 结算按钮Button('结算外卖').margin({left: 20})}.height(100).padding(20).backgroundColor(Color.White).width('100%')}}
}

在这里插入图片描述
点击加号可以添加货物
在这里插入图片描述

相关文章:

【HarmonyOS】HarmonyOS NEXT学习日记:五、交互与状态管理

【HarmonyOS】HarmonyOS NEXT学习日记:五、交互与状态管理 在之前我们已经学习了页面布局相关的知识,绘制静态页面已经问题不大。那么今天来学习一下如何让页面动起来、并且结合所学完成一个代码实例。 交互 如果是为移动端开发应用,那么交…...

处理uniapp刷新后,点击返回按钮跳转到登录页的问题

在使用uniapp的原生返回的按钮时,如果没有刷新会正常返回到对应的页面,如果刷新后会在当前页反复横跳,或者跳转到登录页。那个时候我第一个想法时:使用浏览器的history.back()方法。因为浏览器刷新后还是可以通过右上角的返回按钮…...

工厂方法模式java

文章目录 1. 概念2. 示例3. 代码示例 1. 概念 定义: 工厂方法模式又叫工厂模式,通过定义工厂父类创建对象的公共接口,而子类负责创建具体的对象 作用: 由工厂的子类来决定创建哪一个对象 缺点: 工厂一旦需要生成新的东西就需要修改代码,违背的开放封闭原则 2. 示例 3. 代码示…...

java模拟多ip请求【搬代码】

java模拟多ip请求 package url_demo;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.Random;public class HttpUtilTest…...

微软史诗级的蓝屏

本周经历了微软的蓝屏,一直到周末还在加班处理公司的问题。 个人终端受到的影响较大,服务器上也受到了影响。因为蓝屏的事情导致不少麻烦,据同事说因为蓝屏的问题,MGH 的手术安排也受到了影响。 目前我们也在着手处理有部署 Wind…...

HALCON数据结构

一、HALCON数据结构简介 1、HALCON中有两类参数:图形参数和控制参数。 2、HALCON算子参数中,图形输入参数、图形输出参数、控制输入参数和控制输出参数。 3、图形参数有:图像(image)、区域(region)和轮廓(XLD) 4、控制参数有:…...

数据库系统概论:事务与并发一致性问题

随着网络应用的普及,数据库并发问题变得越来越重要。数据库并发指的是多个用户或进程同时访问和操作数据库的能力。它是数据库系统性能优化的重要方面,旨在提高系统的吞吐量和响应时间,以满足多用户同时访问数据库的需求。然而,这…...

Python编程基础:元组类型、字典类型、集合类型

目录 元组类型创建/删除元组访问/操作元组元组生成式字典类型创建/删除字典访问/操作字典字典相关函数集合类型创建/删除集合集合相关操作符访问/操作集合元组类型 元组是Python中内置的不可变序列,这是它跟列表的不同之处,它没有一系列增删改等操作,只可以使用索引和for循环…...

day2 单机并发缓存

文章目录 1 sync.Mutex2 支持并发读写3 主体结构 Group3.1 回调 Getter3.2 Group 的定义3.3 Group 的 Get 方法 4 测试 本文代码地址: https://gitee.com/lymgoforIT/gee-cache/tree/master/day2-single-node 本文是7天用Go从零实现分布式缓存GeeCache的第二篇。 …...

ECMP等价多路由机制,大模型训练负载均衡流量极化冲突原因,万卡(大规模)集群语言模型(LLM)训练流量拥塞特点

大规模集群,大语言模型(LLM)训练流量特点,ECMP(Equal-Cost Multi-Path Routing)流量极化拥塞原因。 视频分享在这: 2.1 ECMP等价多路由,大模型训练流量特点,拥塞冲突极化产生原因_哔哩哔哩_bi…...

Linux 注意事项

Linux 与 Windows 是两个相互独立的操作系统,两者有较大差距: 1.1 Linux 严格区分大小写(Windows不严格区分大小写); 1.2 Linux 中所有内容,硬件设备都以文件形式保存在 /dev 目录下(万物皆文件…...

力扣SQL50 指定日期的产品价格 双重子查询 coalesce

Problem: 1164. 指定日期的产品价格 coalesce 的使用 简洁版 &#x1f468;‍&#x1f3eb; 参考题解 select distinct p1.product_id,coalesce((select p2.new_pricefrom Products p2where p2.product_id p1.product_id and p2.change_date < 2019-08-16order by p2.…...

MySQL8的备份方案——全量(完全)备份(CentOS)

MySQL8的全量备份 一、安装备份工具二、备份数据三、恢复备份 点击跳转增量备份 点击跳转差异备份 点击跳转压缩备份 一、安装备份工具 官网 下载地址 备份所用工具为percona-xtrabackup 如果下方安装工具的教程失效&#xff0c;请点击上方下载地址转到官方文档查看 下载该工…...

JVM监控及诊断工具-命令行篇--jcmd命令介绍

JVM监控及诊断工具-命令行篇5-jcmd&#xff1a;多功能命令行 一 基本情况二 基本语法jcmd -ljcmd pid helpjcmd pid 具体命令 一 基本情况 在JDK 1.7以后&#xff0c;新增了一个命令行工具jcmd。它是一个多功能的工具&#xff0c;可以用来实现前面除了jstat之外所有命令的功能…...

c++信号和槽机制的轻量级实现,sigslot 库介绍及使用

Qt中的信号与槽机制很好用&#xff0c;然而只在Qt环境中。在现代 C 编程中&#xff0c;对象间的通信是一个核心问题。为了解决这个问题&#xff0c;许多库提供了信号和槽&#xff08;Signals and Slots&#xff09;机制。今天推荐分享一个轻量级的实现&#xff1a;sigslot 库。…...

云原生项目纪事系列 - 项目管理的鲜活事例

大规模云原生系统的新颖性、建设性和挑战性&#xff0c;吸引着许多有数学思想、哲学意识和美学观念的系统架构师&#xff0c;老模也是其中一员。 老模即是文史家庭出身&#xff0c;又有理工学业背景&#xff0c;他基于平时记录的翔实细节&#xff0c;秉持客观原则&#xff0c;使…...

【Vite】快速入门及其配置

概述 Vite是前端构建工具。vite 相较于webpack,vite采用了不同的运行方式&#xff1a; 开发时&#xff0c;并不对代码打包&#xff0c;而是直接采用ESM的方式来运行项目在项目打包部署时&#xff0c;使用 rollup 对项目进行打包除了速度外&#xff0c;vite使用起来也更加方便…...

Armv8/Armv9架构的学习大纲-学习方法-自学路线-付费学习路线

本文给大家列出了Arm架构的学习大纲、学习方法、自学路线、付费学习路线。有兴趣的可以关注&#xff0c;希望对您有帮助。 如果大家有需要的&#xff0c;欢迎关注我的CSDN课程&#xff1a;https://edu.csdn.net/lecturer/6964 ARM 64位架构介绍 ARM 64位架构介绍 ARM架构概况…...

vue 中 ui 组件二次封装后 ref 怎么穿透到子组件里

情景&#xff1a;element-ui 二次封装了 el-table 组件&#xff0c;使用封装组件时&#xff0c;想要调用 el-table 组件内置的一些方法。只在封装组件上定义 ref 是拿不到 el-table 内置方法的。解决方法如下。 1. vue2 封装组件 <template><el-table ref"inn…...

sourcetree中常用功能使用方法及gitlab冲突解决

添加至缓存&#xff1a;等于git add 提交&#xff1a;等于git commit 拉取/获取&#xff1a;等于git pull ,在每次要新增代码或者提交代码前需要先拉取一遍服务器中最新的代码&#xff0c;防止服务器有其他人更新了代码&#xff0c;但我们自己本地的代码在我们更新前跟服务器不…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...