V2版本状态管理(组件传值和函数回调)
1:@Local (可以当作是@state)
@Entry
@ComponentV2
struct TodoList {
@Local isFinish: boolean = false;
build() {
Column() {
Text('待办')
.fontSize(40)
.margin({ bottom: 10 })
Column() {
Image(this.isFinish ? $r('app.media.finished') : $r('app.media.ubfinished'))
.width(300)
.height(300)
Text('Task1')
.decoration({ type: this.isFinish ? TextDecorationType.LineThrough : TextDecorationType.None })
}
.onClick(() => this.isFinish = !this.isFinish)
}
}
}
2:@Param和@Once
v1版本通过@prop接受被@prop修饰的值在子组件可以随意修改,在V2版本中改为了@Param修饰并且为只读要修改要加上@Once
@ComponentV2
struct TaskItem {
@Param taskName: string = '';
@Param @Once isFinish: boolean = false;
build() {
Row() {
// 请开发者自行在src/main/resources/base/media路径下添加finished.png和unfinished.png两张图片,否则运行时会因资源缺失而报错
Image(this.isFinish ? $r('app.media.finished') : $r('app.media.ubfinished'))
.width(28)
.height(28)
Text(this.taskName)
.decoration({ type: this.isFinish ? TextDecorationType.LineThrough : TextDecorationType.None })
}
.onClick(() => {
this.isFinish = !this.isFinish
// this.taskName='好色的邦'
})
}
}
@Entry
@ComponentV2
struct TodoList {
build() {
Column() {
Text('待办')
.fontSize(40)
.margin({ bottom: 10 })
TaskItem({ taskName: 'Task 1', isFinish: false })
TaskItem({ taskName: 'Task 2', isFinish: false })
TaskItem({ taskName: 'Task 3', isFinish: false })
}
}
}
3:@Event和Repeat
相当于V1版本函数回调,不过子组件定义的函数必须加上@Event
Repeat可以实现子组件的复用按需T是泛型(数组的类型),可以实现按可视区需渲染《模拟器好像有bug会闪退用真机测》Repeat支持两种模式:virtualScroll和non-virtualScroll。virtualScroll适用于大量数据的场景,在滚动类容器中按需加载组件,极大节省内存和提升渲染效率。non-virtualScroll适用于数据量较小的场景,一次性渲染所有组件,并在数据变化时仅更新需要变化的部分,避免整体重新渲染。
Repeat<T>(放需要循环的数组)
.each((obj: RepeatItem<T>) => {
放子组件
})
@ComponentV2
struct TaskItem {
@Param taskName: string = '';
@Param @Once isFinish: boolean = false;
@Event deleteTask: () => void = () => {};
build() {
Row() {
// 请开发者自行在src/main/resources/base/media路径下添加finished.png和unfinished.png两张图片,否则运行时会因资源缺失而报错
Image(this.isFinish ? $r('app.media.finished') : $r('app.media.unfinished'))
.width(28)
.height(28)
Text(this.taskName)
.decoration({ type: this.isFinish ? TextDecorationType.LineThrough : TextDecorationType.None })
Button('删除')
.onClick(() => this.deleteTask())
}
.onClick(() => this.isFinish = !this.isFinish)
}
}
@Entry
@ComponentV2
struct TodoList {
@Local tasks: string[] = ['task1','task2','task3'];
@Local newTaskName: string = '';
build() {
Column() {
Text('待办')
.fontSize(40)
.margin({ bottom: 10 })
Repeat<string>(this.tasks)
.each((obj: RepeatItem<string>) => {
TaskItem({
taskName: obj.item,
isFinish: false,
deleteTask: () => this.tasks.splice(this.tasks.indexOf(obj.item), 1)
})
})
Row() {
TextInput({ placeholder: '添加新任务', text: this.newTaskName })
.onChange((value) => this.newTaskName = value)
.width('70%')
Button('增加事项')
.onClick(() => {
this.tasks.push(this.newTaskName);
this.newTaskName = '';
})
}
}
}
}