今天要跟大家聊聊ArkUI中的状态管理机制V1,这可是开发鸿蒙应用时的必备神器哦!🌟

首先,我们要明白UI组件其实就是数据的载体,这些数据大多是静态的。在组件里,我们可以用变量存数据,但有个问题:变量改了,组件却不会更新!😱 就像下面这段代码:

typescript
Copy Code
@Entry
@Component
struct Index {
message: string = ‘Hello World’;
build() {
Column() {
Text(this.message).fontSize(30)
.onClick(() => {
this.message = ‘Welcome’; // 这里改了,但页面不会变哦!
})
}
// …
}
}
怎么办呢?这时候就要请出我们的@State装饰器啦!🎉 它能把组件内的属性变量变成状态属性,当状态数据变化时,用到这个状态的UI组件也会同步更新!🎊

但是!要注意几点规则哦:

基础数据类型(boolean、string、number)变化会直接触发更新!🎈
class类型重新赋值会被观察到,但嵌套属性赋值就不行啦!😢
array类型也是重新赋值和增删改会触发更新,但数组里对象的属性修改还是不行!🚫
Map和Set类型行为与array相同~👌
还有哦,@State修饰的属性要初始化,不过父组件传值时会覆盖掉初始化值。🤓

接下来,说说父子组件间的状态同步~👩‍👧‍👦

@Prop装饰器:父组件状态变更同步给子组件,但子组件的变更不会同步回父组件。👀
@Link装饰器:父子组件状态双向绑定!不过不能在页面入口组件用,而且修饰的属性不能有初始值哦!🚫🚫
举个例子:

typescript
Copy Code
// 自定义组件
@Component
struct CustomText {
@Link message: string
build() {
Text(this.message).onClick(() => {
this.message = ‘你好世界’; // 这里改了,父组件也会变!
})
}
}

// 父组件
@Entry
@Component
struct Index {
@State message: string = ‘Hello World’;
build() {
Column() {
Text(this.message).fontSize(30)
.onClick(() => {
this.message = ‘Welcome’; // 这里改了,子组件也会变!
})
CustomText({message: this.message})
}
// …
}
}
最后,跨多级父子关系的状态同步怎么办?别担心,@Provide和@Consume来帮你!💪

通过供给、消费的模型进行数据同步,摆脱状态传递的束缚!🎈

typescript
Copy Code
@Entry
@Component
struct Index {
@Provide task: Task = new Task(“完成学习任务”, false)
// …
}

// 后代组件
@Component
struct ToDoItem {
@Consume task: Task
// …
}
怎么样?是不是觉得ArkUI的状态管理其实也没那么难啦?😉

快去试试吧~记得回来给我反馈哦!💖

#ArkUI #状态管理 #鸿蒙开发

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐