赞
踩
在应用中,界面通常都是动态的。
ArkUI作为声明式UI,是具有状态UI更新的特点。当用户进行界面交互或有外部时间引起状态改变时,状态的变化会触发组件自动更新。
ArkUI框架提供了多种管理状态的装饰器来修饰变量。
装饰器 | 说明 |
---|---|
@State | 组件内的状态管理 |
@Prop | 从父组件单项同步状态 |
@Link | 与父组件双向同步状态 |
@Provide 和 @Comsume | 跨组件层级双向同步状态 |
当需要在组件内使用状态来控制UI的不同呈现方式时,可以使用@State装饰器。
@Component export default struct TargetListItem { @State isExpanded: boolean = false; ... build() { ... Column() { ... if (this.isExpanded) { Blank() ProgressEditPanel(...) } } .height(this.isExpanded ? $r('app.float.expanded_item_height') : $r('app.float.list_item_height')) .onClick(() => { ... this.isExpanded = !this.isExpanded; ... }) ... } }
当子组件的状态依赖从父组件传递而来时,可以用@Prop装饰。当父组件中状态变化时,该状态也会更新至@Prop修饰的变量;对@Prop修饰的变量的修改不会影响其父组件中的状态
在开发过程中,尤其是列表中,点击了目标一,让目标一有了选中的样式,又重新点击了目标二,那么目标一就需要恢复原样。那么如何用代码实现?
以列表为例子;每一个列表项都有索引值index,我们用clickIndex:记录被点击的目标索引;通过@Link会通知子组件点击了哪一个。然后再通过@Watch来监听是否点击了另一个。
@Link @Watch('onClickIndexChanged') clickIndex: number;
@State isExpanded: boolean = false
...
onClickIndexChanged() {
if (this.clickIndex != this.index) {
this.isExpanded = false;
}
}
跨组件层级双向同步状态是指@Provide修饰的状态变量自动对提供者组件的所有后代组件可用,后代组件通过使用@Consume装饰的变量来获得对提供的状态变量的访问。
@Provide作为数据的提供方,可以更新其子孙节点的数据,并触发页面渲染。
@Consume在感知到@Provide数据的更新后,会触发当前自定义组件的重新渲染。
使用@Provide的好处是开发者不需要多次将变量在组件间传递
// 通过相同的变量名绑定
@Provide a: number = 0;
@Consume a: number;
// 通过相同的变量别名绑定
@Provide('a') b: number = 0;
@Consume('a') c: number;
@ObjectLink和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。