第九篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:ArkUI强大的状态管理机制解读

37 阅读7分钟

build() {
//横向布局组件
Row() {
//嵌套纵向布局组件
Column() {
//文本组件,参数
Text(this.message)
//设置字号
.fontSize(50)
//设置字体粗细
.fontWeight(FontWeight.Bold)
}
//设置页面宽度占比百分比
.width(‘100%’)
}
//设置页面高度占比百分比
.height(‘100%’)
}
}
(二)以上述代码为例说明ArkUI的状态定义和管理
在上述代码中,我们可以看到ArkUI的状态定义和管理的示例:

  1. 首先,在组件的装饰器@Component下方使用装饰器@State来定义一个状态变量message,并给它赋初值为"Hello World"。
  2. 在构造函数build()中,我们使用Row()来创建一个横向布局,并在其中嵌套使用Column()来创建一个纵向布局。
  3. Column()中,我们使用Text()组件来显示状态变量message的值,并通过链式调用方法来设置文本的字体大小和加粗程度。
  4. 最后,我们通过.width('100%').height('100%')来设置组件的宽度和高度占比为100%。

通过上述示例,我们可以看到在ArkUI中,使用装饰器@State来定义状态变量,并在构造函数build()中使用这些状态变量来构建UI界面。当状态变量发生变化时,相关的UI组件会自动更新以反映最新的状态。

请注意,以上示例仅展示了ArkUI状态定义和管理的一部分功能,实际使用中还可以根据需求进行更复杂的状态管理和UI构建。
(三)ArkUI更复杂的状态管理和UI构建示例代码
当然,实际使用中,我们可以根据需求进行更复杂的状态管理和UI构建。以下是一个示例代码,展示了ArkUI中更复杂的状态管理和UI构建:

// 装饰器,指页面入口。 @Entry // 装饰器,指下面开始自定义组件。 @Component // 自定义组件 struct MyApp { // 装饰器,指状态变量,字符串类型,并赋初始值为"Hello World"。 @State message: string = "Hello World";

// 装饰器,指状态变量,布尔类型,并赋初始值为false。 @State isClicked: boolean = false;

// 构造函数,用于声明UI结构。 build() { return ( {/* 条件渲染 */} {this.isClicked ? ( <Text(this.message) .fontSize(24) .fontWeight(FontWeight.Bold) /> ) : ( <Button text="Click Me" onPress={() => this.handleClick()} /> )} ); }

// 处理点击事件的方法 handleClick() { // 更新状态变量 this.message = "Button Clicked!"; this.isClicked = true; } }

在上述示例代码中,我们添加了一个新的状态变量isClicked,并根据其值来进行条件渲染。当isClickedtrue时,显示一个文本组件来展示message的值;当isClickedfalse时,显示一个按钮组件,并在点击按钮时调用handleClick()方法来更新状态变量。

这个示例展示了更复杂的状态管理和UI构建,包括条件渲染和事件处理。通过使用不同的状态变量和相应的逻辑,我们可以根据需求创建更丰富和交互性的用户界面。

四、以官方 HelloWorld 示例代码为例说明ArkUI状态依赖和自动更新

在这里插入图片描述(一)以下是以官方 HelloWorld 示例代码为例,说明 ArkUI 的状态依赖和自动更新的特性:

// 装饰器,指页面入口。 @Entry // 装饰器,指下面开始自定义组件。 @Component // 自定义组件 struct HelloWorld { // 装饰器,指状态变量,字符串类型,并赋初始值为"Hello". @State greeting: string = "Hello";

// 装饰器,指状态变量,字符串类型,并赋初始值为"World". @State target: string = "World";

// 构造函数,用于声明 UI 结构。 build() { return ( {/* 文本组件,显示 greeting 和 target 变量的值 */} <Text(${this.greeting}, ${this.target}!) .fontSize(24) .fontWeight(FontWeight.Bold) />

{/* 按钮组件,点击后更新 target 的值 */} <Button text="Change Target" onPress={() => this.changeTarget()} /> ); }

// 更新 target 的方法 changeTarget() { // 更新状态变量 this.target = "ArkUI"; } }

在上述示例代码中,我们定义了两个状态变量 greetingtarget,分别初始化为 “Hello” 和 “World”。在 build() 方法中,我们使用 <Text> 组件来显示这两个变量的值,并使用 <Button> 组件来触发 changeTarget() 方法。

当点击按钮时,changeTarget() 方法被调用,更新了 target 的值为 “ArkUI”。由于 <Text> 组件中引用了 greetingtarget 这两个状态变量,当 target 的值发生改变时,相关的 UI 组件会自动更新以反映最新的状态。

这展示了 ArkUI 的状态依赖和自动更新的特性。当一个状态变量发生改变时,与之相关联的 UI 组件会自动更新,而不需要手动进行更新操作。

请注意,以上示例仅为演示目的,实际使用中可以根据具体需求定义更多的状态变量,并在 UI 中使用它们。

(二)定义更多的状态变量展示ArkUI状态依赖和自动更新。以下是一个示例代码,展示了在 ArkUI 中定义更多的状态变量,以展示状态依赖和自动更新的特性:

// 装饰器,指页面入口。 @Entry // 装饰器,指下面开始自定义组件。 @Component // 自定义组件 struct Counter { // 装饰器,指状态变量,整数类型,并赋初始值为0。 @State count: number = 0;

// 装饰器,指状态变量,布尔类型,并赋初始值为false。 @State isPaused: boolean = false;

// 构造函数,用于声明 UI 结构。 build() { return ( {/* 文本组件,显示 count 变量的值 */} <Text(Count: ${this.count}) .fontSize(24) .fontWeight(FontWeight.Bold) />

{/* 按钮组件,点击后增加 count 的值 */} <Button text="Increase Count" onPress={() => this.increaseCount()} />

{/* 开关组件,用于暂停/恢复计数 */} <Switch value={this.isPaused} onValueChange={(value) => this.togglePause(value)} /> ); }

// 增加 count 值的方法 increaseCount() { // 只有当 isPaused 为 false 时才增加 count 的值 if (!this.isPaused) { this.count++; } }

// 切换暂停状态的方法 togglePause(value: boolean) { this.isPaused = value; } }

在上述示例代码中,我们定义了两个状态变量 countisPaused,分别初始化为 0 和 false。在 build() 方法中,我们使用 <Text> 组件显示 count 变量的值,并使用 <Button> 组件来增加 count 的值。同时,我们还使用 <Switch> 组件来切换 isPaused 的值。

当点击按钮增加 count 的值时,只有当 isPaused 的值为 false 时才会增加。而当切换开关组件的状态时,会更新 isPaused 的值。由于 <Text> 组件引用了 count 这个状态变量,当 count 的值发生改变时,相关的 UI 组件会自动更新以反映最新的状态。

这展示了 ArkUI 的状态依赖和自动更新的特性。通过定义多个状态变量并在 UI 中使用它们,可以实现更复杂的状态管理和自动更新的效果。

请注意,以上示例仅为演示目的,实际使用中可以根据具体需求定义更多的状态变量,并在 UI 中使用它们。

五、以官方helloworld示例代码为例说明ArkUI异步状态更新

在这里插入图片描述在 ArkUI 中,可以使用异步操作来更新状态。以下是以官方 HelloWorld 示例代码为例,说明 ArkUI 的异步状态更新的特性:

// 装饰器,指页面入口。 @Entry // 装饰器,指下面开始自定义组件。 @Component // 自定义组件 struct HelloWorld { // 装饰器,指状态变量,字符串类型,并赋初始值为"Hello". @State greeting: string = "Hello";

// 装饰器,指状态变量,字符串类型,并赋初始值为"World". @State target: string = "World";

// 构造函数,用于声明 UI 结构。 build() { return ( {/* 文本组件,显示 greeting 和 target 变量的值 */} <Text(${this.greeting}, ${this.target}!) .fontSize(24) .fontWeight(FontWeight.Bold) />

{/* 按钮组件,点击后异步更新 target 的值 */} <Button text="Change Target" onPress={() => this.changeTargetAsync()} /> ); }

// 异步更新 target 的方法 async changeTargetAsync() { // 模拟异步操作,比如发送网络请求或执行耗时任务 await sleep(2000); // 假设等待2秒钟

// 更新状态变量 this.target = "ArkUI"; } }

// 辅助函数,用于模拟异步操作的延迟 function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); }

在上述示例代码中,我们添加了一个新的方法 changeTargetAsync(),用于模拟异步操作。在这个方法中,我们使用了 await 关键字来等待一个延迟,比如发送网络请求或执行耗时任务。在这里,我们使用了 sleep() 辅助函数来模拟等待2秒钟。

在异步操作完成后,我们更新了 target 的值为 “ArkUI”。由于 <Text> 组件中引用了 greetingtarget 这两个状态变量,当 target 的值发生改变时,相关的 UI 组件会自动更新以反映最新的状态。

这展示了 ArkUI 的异步状态更新的特性。通过使用异步操作,可以在需要的时候更新状态,并且 UI 组件会自动更新以反映最新的状态。

请注意,以上示例仅为演示目的,实际使用中可以根据具体需求执行各种异步操作,并在操作完成后更新相应的状态。

六、以官方helloworld示例代码为例说明ArkUI状态持久化和恢复

在这里插入图片描述在 ArkUI 中,可以通过使用持久化存储来实现状态的持久化和恢复。以下是以官方 HelloWorld 示例代码为例,说明 ArkUI 的状态持久化和恢复的特性:

// 装饰器,指页面入口。 @Entry // 装饰器,指下面开始自定义组件。 @Component // 自定义组件 struct HelloWorld { // 装饰器,指状态变量,字符串类型,并赋初始值为"Hello". @State greeting: string = "Hello";

// 装饰器,指状态变量,字符串类型,并赋初始值为"World". @State target: string = "World";

// 构造函数,用于声明 UI 结构。 build() { return ( {/* 文本组件,显示 greeting 和 target 变量的值 */} <Text(${this.greeting}, ${this.target}!) .fontSize(24) .fontWeight(FontWeight.Bold) />

{/* 按钮组件,点击后保存状态到本地存储 */} <Button text="Save State" onPress={() => this.saveState()} />

{/* 按钮组件,点击后从本地存储中恢复状态 */} <Button text="Restore State" onPress={() => this.restoreState()} /> ); }

// 保存状态到本地存储的方法 saveState() { // 使用 localStorage 或其他持久化存储方式保存状态 localStorage.setItem("greeting", this.greeting); localStorage.setItem("target", this.target); }

// 从本地存储中恢复状态的方法 restoreState() { // 从 localStorage 或其他持久化存储方式中读取状态 const savedGreeting = localStorage.getItem("greeting"); const savedTarget = localStorage.getItem("target");

// 恢复状态 if (savedGreeting) { this.greeting = savedGreeting; } if (savedTarget) { this.target = savedTarget; } } }

在上述示例代码中,我们添加了两个方法 saveState()restoreState(),用于保存和恢复状态。在 saveState() 方法中,我们使用 localStorage 或其他持久化存储方式将状态保存起来。在 restoreState() 方法中,我们从持久化存储中读取之前保存的状态,并将其恢复到相应的状态变量中。

通过在按钮组件上绑定这两个方法,我们可以实现在点击按钮时保存和恢复状态的功能。

这展示了 ArkUI 的状态持久化和恢复的特性。通过使用持久化存储,可以将状态保存到本地,并在需要时恢复状态,以实现状态的持久化和恢复。

请注意,以上示例仅为演示目的,实际使用中可以根据具体需求选择合适的持久化存储方式,并在适当的时机保存和恢复状态。

七、以官方helloworld示例代码为例说明ArkUI的状态订阅和通知

在这里插入图片描述在 ArkUI 中,可以使用状态订阅和通知的机制来实现组件之间的状态传递和更新。以下是以官方 HelloWorld 示例代码为例,说明 ArkUI 的状态订阅和通知的特性:

// 装饰器,指页面入口。 @Entry // 装饰器,指下面开始自定义组件。 @Component // 自定义组件 struct HelloWorld { // 装饰器,指状态变量,字符串类型,并赋初始值为"Hello". @State greeting: string = "Hello";

// 装饰器,指状态变量,字符串类型,并赋初始值为"World". @State target: string = "World";

// 构造函数,用于声明 UI 结构。 build() { return ( {/* 文本组件,显示 greeting 和 target 变量的值 */}

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取