鸿蒙 NEXT 开发 - 组件事件监听和状态管理
1. 组件事件
监听原生组件的事件和设置属性的方式是一样的都是链式调用,值得注意的是,我们注册事件必须使用箭头函数的写法,Next 版本禁止使用匿名函数的形式来给组件注册事件
匿名函数 function () {}
尝试给一个 TextInput 和一个按钮注册一个值改变事件和点击事件
promptAction 弹出需要引入一个包才可以使用的,功能更多一些
AlertDialog 不需要引入包使用的,功能单一
请注意:在注册事件中的逻辑必须使用箭头函数 () => {}
因为 function 中 this 指向为 undefind
箭头函数中的 this 指向当前 struct 实例,可以方便的调用方法和获取属性
1.1 登录小案例
2. 组件状态管理
在声明式 UI 编程框架中,UI 是程序状态的运行结果,用户构建了一个 UI 模型,其中应用的运行时的状态是参数。当参数改变时,UI 作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的 UI 的重新渲染,在 ArkUI 中统称为状态管理机制。

编辑
2.1 @State 装饰器:组件内状态
2.1.1 基本介绍
@State 装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI 会发生对应的渲染改变。
需要注意的是,State 修饰的类型
Object、class、string、number、boolean、enum 类型,以及这些类型的数组。嵌套类型以及数组中的对象属性无法触发视图更新
类型必须被指定。
不支持 any,不支持简单类型和复杂类型的联合类型,不允许使用 undefined 和 null。
2.1.2 简单代码示例-字符串类型
2.1.3 简单代码示例-number 类型
2.1.4 简单代码示例-对象类型
2.1.5 简单代码示例-嵌套对象-不能触发视图更新
2.2 @Prop 装饰器:父子单向同步
2.2.1 基本介绍
@Prop 装饰的变量可以和父组件建立单向的同步关系。@Prop 装饰的变量是可变的,但是变化不会同步回其父组件。
允许装饰的变量的类型
Object、class、string、number、boolean、enum 类型,以及这些类型的数组。
不支持 any,支持 undefined 和 null。
支持 Date 类型。
嵌套类型以及数组中的对象属性无法触发视图更新

编辑
2.2.2 简单代码示例
2.3 @Link 装饰器:父子双向同步
2.3.1 基本介绍
子组件中被 @Link 装饰的变量与其父组件中对应的数据源建立双向数据绑定。
允许装饰的变量类型
Object、class、string、number、boolean、enum 类型,以及这些类型的数组。
支持 Date 类型。嵌套类型以及数组中的对象属性无法触发视图更新

编辑
2.3.2 简单代码示例
2.4 @Provide 和 @Consume 装饰器:与后代组件双向同步
2.4.1 基本介绍
@Provide 和 @Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。
@Provide/@Consume 装饰的状态变量有以下特性:
@Provide 装饰的状态变量自动对其所有后代组件可用,即该变量被“provide”给他的后代组件。由此可见,@Provide 的方便之处在于,开发者不需要多次在组件之间传递变量。
后代通过使用 @Consume 去获取 @Provide 提供的变量,建立在 @Provide 和 @Consume 之间的双向数据同步,与 @State/@Link 不同的是,前者可以在多层级的父子组件之间传递。
@Provide 和 @Consume 可以通过相同的变量名或者相同的变量别名绑定,建议类型相同,否则会发生类型隐式转换,从而导致应用行为异常。
允许装饰的变量类型
Object、class、string、number、boolean、enum 类型,以及这些类型的数组。
支持 Date 类型。
嵌套类型以及数组中的对象属性无法触发视图更新
2.4.2 简单代码示例
2.5 @Observed 和 @ObjectLink 装饰器:嵌套类对象属性变化
2.5.1 基本介绍
上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项 class,或者 class 的属性是 class,他们的第二层的属性变化是无法观察到的。这就引出了 @Observed/@ObjectLink 装饰器。
@ObjectLink 和 @Observed 类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步:
被 @Observed 装饰的类,可以被观察到属性的变化;
子组件中 @ObjectLink 装饰器装饰的状态变量用于接收 @Observed 装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被 @Observed 装饰的项,或者是 class object 中的属性,这个属性同样也需要被 @Observed 装饰。
@Observed 用于嵌套类场景中,观察对象类属性变化,要配合自定义组件使用(示例详见嵌套对象),如果要做数据双/单向同步,需要搭配 @ObjectLink 或者 @Prop 使用(示例详见@Prop与@ObjectLink的差异)。
允许装饰的变量类型
必须为被 @Observed 装饰的 class 实例,必须指定类型。
不支持简单类型,可以使用@Prop。
支持继承 Date、Array的 class 实例
2.5.2 简单代码示例
3. 排行榜小案例
实现如下功能

编辑
3.1 代码结构

编辑
3.2 Index.ets
3.3 FruitModel.ets
3.4 TitleComponent.ets
3.5 TableHeaderComponent.ets
3.6 ItemComponent.ets
版权声明: 本文为 InfoQ 作者【东林知识库】的原创文章。
原文链接:【http://xie.infoq.cn/article/0414d0c43621d940d5b4fd20d】。文章转载请联系作者。
评论