HarmonyOS NEXT应用开发之@Link装饰器:父子双向同步,HarmonyOS鸿蒙图书管理系统源码

慈云数据 6个月前 (05-14) 技术支持 35 0

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

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

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

img

img

img

htt

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

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

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

img

正文

.width(312)

.height(40)

.margin(12)

.fontColor(‘#FFFFFF,90%’)

.onClick(() => {

this.yellowButtonProp = (this.yellowButtonProp

})

// class类型从父组件@State向子组件@Link数据同步

Button(‘Parent View: Set GreenButton’)

.width(312)

.height(40)

.margin(12)

.fontColor(‘#FFFFFF,90%’)

.onClick(() => {

this.greenButtonState.width = (this.greenButtonState.width

})

// class类型初始化@Link

GreenButton({ greenButtonState: $greenButtonState }).margin(12)

// 简单类型初始化@Link

YellowButton({ yellowButtonState: $yellowButtonProp }).margin(12)

}

}

}

}

数组类型的@Link

@Component

struct Child {

@Link items: number[];

build() {

Column() {

Button(Button1: push)

.margin(12)

.width(312)

.height(40)

.fontColor(‘#FFFFFF,90%’)

.onClick(() => {

this.items.push(this.items.length + 1);

})

Button(Button2: replace whole item)

.margin(12)

.width(312)

.height(40)

.fontColor(‘#FFFFFF,90%’)

.onClick(() => {

this.items = [100, 200, 300];

})

}

}

}

@Entry

@Component

struct Parent {

@State arr: number[] = [1, 2, 3];

build() {

Column() {

Child({ items: KaTeX parse error: Expected 'EOF', got '}' at position 5: arr }̲) .margin(12) F…{item}`)

.margin(12)

.width(312)

.height(40)

.backgroundColor(‘#11a2a2a2’)

.fontColor(‘#e6000000’)

},

(item: ForEachInterface) => item.toString()

)

}

}

}

上文所述,ArkUI框架可以观察到数组元素的添加,删除和替换。在该示例中@State和@Link的类型是相同的number[],不允许将@Link定义成number类型(@Link item : number),并在父组件中用@State数组中每个数据项创建子组件。如果要使用这个场景,可以参考 @Prop 和@Observed。

装饰Map类型变量

说明:

从API version 11开始,@Link支持Map类型。

在下面的示例中,value类型为Map,点击Button改变message的值,视图会随之刷新。

@Component

struct Child {

@Link value: Map

build() {

Column() {

ForEach(Array.from(this.value.entries()), (item: [number, string]) => {

Text(${item[0]}).fontSize(30)

Text(${item[1]}).fontSize(30)

Divider()

})

Button(‘child init map’).onClick(() => {

this.value = new Map([[0, “a”], [1, “b”], [3, “c”]])

})

Button(‘child set new one’).onClick(() => {

this.value.set(4, “d”)

})

Button(‘child clear’).onClick(() => {

this.value.clear()

})

Button(‘child replace the first one’).onClick(() => {

this.value.set(0, “aa”)

})

Button(‘child delete the first one’).onClick(() => {

this.value.delete(0)

})

}

}

}

@Entry

@Component

struct MapSample2 {

@State message: Map = new Map([[0, “a”], [1, “b”], [3, “c”]])

build() {

Row() {

Column() {

Child({ value: this.message })

}

.width(‘100%’)

}

.height(‘100%’)

}

}

装饰Set类型变量

说明:

从API version 11开始,@Link支持Set类型。

在下面的示例中,message类型为Set,点击Button改变message的值,视图会随之刷新。

@Component

struct Child {

@Link message: Set

build() {

Column() {

ForEach(Array.from(this.message.entries()), (item: [number, string]) => {

Text(${item[0]}).fontSize(30)

Divider()

})

Button(‘init set’).onClick(() => {

this.message = new Set([0, 1, 2, 3, 4])

})

Button(‘set new one’).onClick(() => {

this.message.add(5)

})

Button(‘clear’).onClick(() => {

this.message.clear()

})

Button(‘delete the first one’).onClick(() => {

this.message.delete(0)

})

}

.width(‘100%’)

}

}

@Entry

@Component

struct SetSample1 {

@State message: Set = new Set([0, 1, 2, 3, 4])

build() {

Row() {

Column() {

Child({ message: this.message })

}

.width(‘100%’)

}

.height(‘100%’)

}

}

Link支持联合类型实例

@Link支持联合类型和undefined和null,在下面的示例中,name类型为string | undefined,点击父组件Index中的Button改变name的属性或者类型,Child中也会对应刷新。

@Component

struct Child {

@Link name: string | undefined

build() {

Column() {

Button(‘Child change name to Bob’)

.onClick(() => {

this.name = “Bob”

})

Button(‘Child change animal to undefined’)

.onClick(() => {

this.name = undefined

})

}.width(‘100%’)

}

}

@Entry

@Component

struct Index {

@State name: string | undefined = “mary”

build() {

Column() {

Text(The name is ${this.name}).fontSize(30)

Child({ name: this.name })

Button(‘Parents change name to Peter’)

.onClick(() => {

this.name = “Peter”

})

Button(‘Parents change name to undefined’)

.onClick(() => {

this.name = undefined

})

}

}

}

常见问题

@Link装饰状态变量类型错误

在子组件中使用@Link装饰状态变量需要保证该变量与数据源类型完全相同,且该数据源需为被诸如@State等装饰器装饰的状态变量。

【反例】

@Observed

class ClassA {

public c: number = 0;

constructor(c: number) {

this.c = c;

}

}

@Component

struct LinkChild {

@Link testNum: number;

build() {

Text(LinkChild testNum ${this.testNum})

}

}

@Entry

@Component

struct Parent {

@State testNum: ClassA[] = [new ClassA(1)];

build() {

Column() {

Text(Parent testNum ${this.testNum[0].c})

.onClick(() => {

this.testNum[0].c += 1;

})

// @Link装饰的变量需要和数据源@State类型一致

LinkChild({ testNum: this.testNum[0].c })

}

}

}

@Link testNum: number从父组件的LinkChild({testNum:this.testNum.c})初始化。@Link的数据源必须是装饰器装饰的状态变量,简而言之,@Link装饰的数据必须和数据源类型相同,比如@Link: T和@State : T。所以,这里应该改为@Link testNum: ClassA,从父组件初始化的方式为LinkChild({testNum: $testNum})

【正例】

@Observed

class ClassA {

public c: number = 0;

constructor(c: number) {

this.c = c;

}

}

@Component

struct LinkChild {

@Link testNum: ClassA[];

build() {

Text(LinkChild testNum ${this.testNum[0]?.c})

}

}

@Entry

@Component

struct Parent {

@State testNum: ClassA[] = [new ClassA(1)];

build() {

Column() {

Text(Parent testNum ${this.testNum[0].c})

.onClick(() => {

this.testNum[0].c += 1;

})

// @Link装饰的变量需要和数据源@State类型一致

LinkChild({ testNum: $testNum })

}

}

}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05
  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05
  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05
  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全

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

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

img

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

02d1bcf9201e3d3d8baf3b812f8e370.webp?x-oss-process=image/format,png)

基于ArkTS 开发:https://qr21.cn/FV7h05
  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全

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

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

[外链图片转存中…(img-Vx589TBH-1713133861093)]

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

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon