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

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

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

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

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

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);
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

localStorage.setItem(“greeting”, this.greeting);
localStorage.setItem(“target”, this.target);
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-Do1Rvt8o-1713202990692)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值