ArkUI极简教程10:@State状态数据的使用

在本章中,你将学会如何使用@State装饰器的基础使用,及其实际开发中的使用场景。

@State装饰器-状态数据

在前面的章节中,无论是Text还是Image、Button控件,我们都是直接在其闭包中填入一个"静态"的内容作为参数值,来表明这个控件的作用。

但更多的开发场景中,往往显示的内容会随着业务的需求而发生变化,这样我们就不能在控件中直接填入参数值,而是将参数声明出来,再根据业务场景更新这个参数的值。

举一个简单的案例,之前很火的"敲击木鱼"的案例,当用户点击"木鱼"按钮时,会显示点击的次数。以此为例我们先构建一个简单的样式。如下代码所示:

scss 复制代码
Row() {
  Column({ space: 48 }) {
    // 文字
    Text('快乐+1')
      .fontSize(17)

    // 点击按钮
    Button('点击我')
      .width(120)
      .onClick(() => {

      })
  }
  .width('100%')
}
.height('100%')

上述代码中,我们显示了一个Text文字视图和Button按钮视图,并且使用Column、Row布局容器使其居中显示,这是静态页面的效果。

下一步,我们希望点击Button按钮的时候,文字内容中的"+1"能够不断累加,每点击一次增加数字1。于是,我们就需要使用到@State装饰器。

@State装饰器所表示的变量是一种状态数据,当它表示的值改变时,那么使用到@State装饰器表示的值的UI也会自动刷新。

我们将所需要动态刷新的值通过@State装饰器来表示,如下代码所示:

kotlin 复制代码
// 参数声明
@State totalNumber: number = 0

// 参数使用
Text('快乐+'+this.totalNumber.toString())

// 参数更新
this.totalNumber ++

上述代码中,我们使用@State装饰器表示了一个number数值类型的参数totalNumber,并赋予默认值为0。在显示内容上,使用"+"运算符可以进行字符串的拼接,但由于totalNumber为数值类型,因此还使用了toString方法将其转为string字符串类型。

最后在数值更新方法上,在点击按钮的交互事件中,我们使用"++"自增的方法,来实现点击按钮时自动增加数值。于是在右侧预览窗口中,我们可以体验到点击按钮实现"快乐+1"的效果。

使用场景-Progress进度条

下面我们来看一下实际的使用场景。

通过@State装饰器我们可以控制一个参数值的增加减少,我们可以想到什么实际场景,比如:进度条。如下代码所示:

less 复制代码
// 参数
@State value: number = 0

// 进度条
Progress({
  value: this.value,
  total: 100,
  type: ProgressType.Ring
})
  .style({strokeWidth: 10})
  .width(200)
  .height(200)

// 点击事件
.onClick(() => {
  this.value += 10
})

上述代码中,我们使用了Progress进度条组件来构建主体样式,设置Progress进度条的value参数绑定使用@State装饰器表示的值,用于控制进度条的进度。

当点击按钮时,我们让value的值增加10,如此实现进度条简单的控制逻辑。当然,我们也可以增加一个Text文字来显示进度文字,如下代码所示:

scss 复制代码
Stack() {
  // 进度条
  Progress({
    value: this.value,
    total: 100,
    type: ProgressType.Ring
  })
    .style({ strokeWidth: 10 })
    .width(200)
    .height(200)

  // 进度文字
  Text(this.value.toString()+'%')
    .fontSize(32)
    .fontWeight(600)
}

使用场景-Toast提示框

再来介绍另一个场景,当用户点击按钮时,常常会伴随着系统反馈信息,通常情况下,我们会使用Toast来进行友好提示。

而Toast提示的内容有时候会根据场景来决定,比如现在的Progress进度条,我们希望提示用户当前增加了多少,那么就会使用到@State装饰器来表示状态参数。

以此为例,我们实现Toast组件的相关功能,如下代码所示:

javascript 复制代码
// 引入组件
import prompt from '@ohos.promptAction';

// 使用组件
prompt.showToast({
  message: '当前进度:'+this.value.toString()+'%',
  duration: 2000
});

上述代码中,我们首先引入了'@ohos.promptAction'这一显示Toast的API,该API可以实现Dialog弹窗、Toast提示的交互效果。

在点击按钮时,调用showToast方法来显示一个Toast提示框的内容,在其参数中配置message显示的内容参数的值为this.value.toString()文字类型的进度内容,并设置duration持续时长为2000毫秒(2秒)。

如此,当每次点击的时候,我们就可以在Toast提示框中看到更新后的进度结果,这多亏了@State装饰器控制的逻辑。

快来动手试试吧~

下一章节,我们继续介绍另外2个和@State装饰器配合使用的装饰器,请保持期待吧~

相关推荐
sulikey8 小时前
个人Linux操作系统学习笔记2 - gcc与库的理解
linux·笔记·学习·操作系统·gcc·
nashane10 小时前
HarmonyOS 6学习:PC端悬浮窗模式与智能长截图的协同优化实战
学习·华为·harmonyos
阿钱真强道13 小时前
23 鸿蒙LiteOS 消息队列(Queue)实战教程:任务间数据传递详解
harmonyos·鸿蒙·消息·队列·liteos·rk2206·瑞星微
前端不太难14 小时前
AI 不只是聊天框:鸿蒙 App 新入口
人工智能·状态模式·harmonyos
leon_teacher15 小时前
HarmonyOS 6 实战:基于 Ads Kit 的插屏广告(视频 + 图片)架构与实现全解析
架构·音视频·harmonyos
Hoxy.R15 小时前
银河麒麟 V10 离线安装 s3cmd 踩坑记录+存储负载均衡测试
linux·运维·华为·存储
大师兄666815 小时前
HarmonyOS 服务卡片开发之JS 卡片开发
javascript·华为·harmonyos·harmonyos6·formkit
程序猿追16 小时前
HarmonyOS 6.0 NEXT:基于 Map Kit 实现一款“手绘路线”骑行导航应用
华为·harmonyos
手可摘星辰的少年17 小时前
Ext2文件系统核心结构详解:超级块、位图、Inode与多级间接块
操作系统
轻口味17 小时前
HarmonyOS 6.1 全栈实战录 - 08 视讯巅峰:Media Kit 视频缩略图批量提取与 HDR 渲染链路实战
华为·音视频·harmonyos