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

鸿蒙:状态管理V2(V2装饰器的学习)

前言:

1、我们一起来学习鸿蒙V2装饰器的使用。我们从官方文档和示例代码入手,学习并实践,看完这篇博客,你会有所收获。

2、本博客尽量以简单的方式呈现核心的用法,提供完整的运行效果和示例代码。

一、下方是官方文档和示例仓库的链接:

文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-mvvm-v2GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/openharmony/applications_app_samples/tree/master/code/DocsSample/ArkUISample/StateMgmtV2MVVM二、下面是V2装饰器的用法,口语化版,不包准确:

1、@ComponentV2 修饰自定义组件(个人理解,和@Component的用法差不多,功能也相似,但是能在这个组件内使用别的V2装饰器,你就需要使用@ComponentV2修饰组件

2、@Local 用法和@State差不多,用来修饰状态变量的。

LocalView.ets

@Entry
@ComponentV2
export struct LocalView {@Local isFinish: number = 0;build() {Column() {Text(this.isFinish.toString()).fontSize(40).margin({ bottom: 10 }).onClick(() => this.isFinish++)}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)}
}

3、@Param 用在V2子组件,用来修饰变量,接收V2父组件传递的数据

4、@Once 配合@Param使用,使子组件的参数变量变成状态变量,改变了值UI也会更新。

ParamView.ets

@ComponentV2
struct ParamViewItem {@Param taskName: string = '';@Param @Once isFinish: boolean = false;build() {Row() {Text(this.taskName).fontSize(20).decoration({ type: this.isFinish ? TextDecorationType.LineThrough : TextDecorationType.None })}.onClick(() => this.isFinish = !this.isFinish)}
}@Entry
@ComponentV2
export struct ParamView {build() {Column() {Text("ParamView的父组件标题").fontSize(40).margin({ bottom: 10 })ParamViewItem({ taskName: '子组件 1', isFinish: false })ParamViewItem({ taskName: '子组件 2', isFinish: false })ParamViewItem({ taskName: '子组件 3', isFinish: false })}}
}

5、@Event 修饰V2子组件的方法,使得V2父组件可以传递方法进去

EventView.ets

@ComponentV2
struct TaskItem {@Param taskName: string = '';@Param @Once isFinish: boolean = false;@Event deleteTask: () => void = () => {};build() {Row() {Text(this.taskName).decoration({ type: this.isFinish ? TextDecorationType.LineThrough : TextDecorationType.None })Button("删除").onClick(() => this.deleteTask())}.onClick(() => this.isFinish = !this.isFinish)}
}@Entry
@ComponentV2
export struct EventView {@Local tasks: string[] = ['task1', 'task2', 'task3'];@Local newTaskName: string = '';build() {Column() {Text("父组件").fontSize(40).margin({ bottom: 10 })ForEach(this.tasks, (task: string) => {TaskItem({taskName: task,isFinish: false,deleteTask: () => this.tasks.splice(this.tasks.indexOf(task), 1)})})Row() {TextInput({ placeholder: "输入文字", text: this.newTaskName }).onChange((value) => this.newTaskName = value).width('70%')Button('+').onClick(() => {this.tasks.push(this.newTaskName);this.newTaskName = '';})}}}
}

6、@ObservedV2  @Trace 这两个装饰器配合使用,检测类参数变化

ObservedV2.ets

@ObservedV2
class Task {public taskName: string = '';@Trace public isFinish: boolean = false;constructor(taskName: string, isFinish: boolean) {this.taskName = taskName;this.isFinish = isFinish;}
}@ComponentV2
struct TaskItem {@Param task: Task = new Task('', false);@Event deleteTask: () => void = () => {};build() {Row() {Image(this.task.isFinish ? $r('app.media.startIcon') : $r('app.media.background')).width(28).height(28)Text(this.task.taskName).decoration({ type: this.task.isFinish ? TextDecorationType.LineThrough : TextDecorationType.None })Button("删除").onClick(() => this.deleteTask())}.onClick(() => this.task.isFinish = !this.task.isFinish)}
}@Entry
@ComponentV2
export struct ObservedV2View {@Local tasks: Task[] = [new Task('task1', false),new Task('task2', false),new Task('task3', false),];@Local newTaskName: string = '';finishAll(ifFinish: boolean) {for (let task of this.tasks) {task.isFinish = ifFinish;}}build() {Column() {Text("父组件标题").fontSize(40).margin({ bottom: 10 })Repeat<Task>(this.tasks).each((obj: RepeatItem<Task>) => {TaskItem({task: obj.item,deleteTask: () => this.tasks.splice(this.tasks.indexOf(obj.item), 1)})})Row() {Button("完成所有的任务").onClick(() => this.finishAll(true))Button("取消").onClick(() => this.finishAll(false))}Row() {TextInput({ placeholder: "添加新的任务", text: this.newTaskName }).onChange((value) => this.newTaskName = value).width('70%')Button('+').onClick(() => {this.tasks.push(new Task(this.newTaskName, false));this.newTaskName = '';})}}}
}

以上是个人经验分享

http://www.xdnf.cn/news/19913.html

相关文章:

  • 超详细教程:一招一式教你将本地项目上传至GitHub
  • 【系统架构设计(13)】项目管理上:盈亏平衡分析与进度管理
  • SpringBoot 网络流量抓包与分析系统
  • 【RNN-LSTM-GRU】第一篇 序列建模基础:理解数据的“顺序”之力
  • Mac 使用 softhsm
  • 革新光纤锁模技术:《Light: Science Applications》报道纳米腔增强型可饱和吸收器
  • 质量管理里常见的缩写QA、QC、QE都是什么意思?
  • 彻底搞懂面向对象分析(OOA)
  • Linux内存管理章节一:深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间
  • 逻辑回归基础
  • .NET GcPDF V8.2 新版本:人工智能 PDF 处理
  • Spring Boot 根据配置优雅的决定实现类
  • Meshroom 2025.1.0安装及使用参数模板介绍:二维图片转三维重建
  • 因为对象装箱拆箱导致的空指针异常
  • C#强制类型转换(显示转换)和安全类型转换
  • 野火STM32Modbus主机读取寄存器/线圈失败(三)-尝试将存贮事件的地方改成数组(非必要解决方案)(附源码)
  • VBA中类的解读及应用第二十七讲:利用类完成查找的方案-5
  • SVT-AV1 svt_aom_motion_estimation_kernel 函数分析
  • 详细学习计划
  • 百度前端社招面经
  • 云手机运行是否消耗自身流量?
  • Docker(④Shell脚本)
  • 【RNN-LSTM-GRU】第五篇 序列模型实战指南:从选型到优化与前沿探索
  • 应对反爬:使用Selenium模拟浏览器抓取12306动态旅游产品
  • 40,.Ansible角色(roles)
  • 具身智能多模态感知与场景理解:视觉探索
  • 如何本地编译servicecomb-java-chassis
  • Focal Loss
  • Elasticsearch 8 中 Nested 数据类型的使用方法
  • 【文献解读】ceRNA机制研究经典思路