142.HarmonyOS NEXT系列教程之3D立方体旋转轮播案例讲解之属性与状态管理

2025-03-20 22:00:08
136次阅读
0个评论

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

142_1.png

HarmonyOS NEXT系列教程之3D立方体旋转轮播案例讲解之属性与状态管理

效果演示

3d旋转.gif

1. 属性系统概述

1.1 对外属性

// 基础配置属性
duration: number = 500;
autoPlay: boolean = true;
loop: boolean = true;

// 数据相关属性
items: ESObject[] = [];
swiperData: SwiperDataSource = new SwiperDataSource();

// 控制器属性
cubeSwiperController?: CubeSwiperController;

1.2 内部状态

@State currentIndex: number = 0;
@State angleList: number[] = [];
@State centerXList: Array<number | string> = [];
private swiperController: SwiperController = new SwiperController();

2. 状态装饰器使用

2.1 @State装饰器

  • 用途:管理组件内部状态
  • 特点:状态变化会触发UI更新
@State currentIndex: number = 0; // 当前页面索引
@State angleList: number[] = []; // 旋转角度列表
@State centerXList: Array<number | string> = []; // 旋转中心点列表

2.2 @Builder装饰器

  • 用途:定义可复用的UI构建方法
@Builder
defaultSwiperItemBuilder(item: ESObject) {
    Image(item)
        .objectFit(ImageFit.Cover)
        .width($r('app.string.cube_animation_full_size'))
        .height($r('app.string.cube_animation_full_size'))
}

3. 属性初始化和更新

3.1 初始化过程

aboutToAppear(): void {
    // 参数验证和默认值设置
    if (this.items.length === 0 || this.swiperItemSlotParam === undefined) {
        this.items = IMAGES;
        this.swiperItemSlotParam = this.defaultSwiperItem;
    }
    
    // 初始化数据和动画属性
    this.swiperData.setData(this.items);
    this.resetAnimationAttr();
}

3.2 动画属性重置

resetAnimationAttr() {
    this.angleList = new Array(this.items.length).fill(0);
    this.centerXList = new Array(this.items.length).fill('100%');
}

4. 状态管理最佳实践

4.1 状态隔离

  1. 将UI相关状态与业务数据分开管理
  2. 使用私有属性保护内部状态
  3. 通过方法控制状态更新

4.2 性能优化

// 使用LazyForEach优化渲染性能
LazyForEach(this.swiperData, (item: ESObject, index: number) => {
    Stack() {
        this.swiperItemSlotParam(item)
    }
})

5. 数据绑定机制

5.1 单向数据流

  1. 属性从父组件向子组件传递
  2. 状态变化触发UI更新
  3. 通过控制器实现数据操作

5.2 数据同步

// 数据更新示例
updateData: (index: number, data: ESObject) => void = (index: number, data: ESObject) => {
    this.swiperData.updateData(index, data);
};

6. 控制器绑定

6.1 方法绑定

if (this.cubeSwiperController) {
    this.cubeSwiperController.addData = this.addData;
    this.cubeSwiperController.deleteData = this.deleteData;
    this.cubeSwiperController.pushData = this.pushData;
    this.cubeSwiperController.updateData = this.updateData;
    this.cubeSwiperController.setData = this.setData;
}

6.2 使用示例

// 外部使用控制器更新数据
cubeSwiperController.addData(0, newItem);

7. 小结

本篇教程详细介绍了:

  1. 组件的属性系统设计
  2. 状态管理机制
  3. 数据绑定和同步
  4. 控制器使用方法

下一篇将介绍组件的生命周期和初始化过程。

收藏00

登录 后评论。没有帐号? 注册 一个。