一、状态管理
1.在声明式UI中,是以状态驱动视图更新:
①状态(State):指驱动视图更新的数据(被装饰器标记的变量)
②视图(View):基于UI描述渲染得到用户界面
注意:
①@State装饰器标记的变量必须初始化,不能为空值
②@State支持object、class、string、number、boolean、enum类型以及这些类型的数组
③嵌套类型以及数组中的对象属性无法触发视图更新
例子:
class Person{
name:string
age:number
friend:Person
constructor(name:string,age:number,friend?:Person) {
this.name=name
this.age=age
this.friend=friend
}
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
@State P:Person=new Person('张三',18,new Person('zz',10))
build() {
Row() {
Column() {
// 正常发生变化
Text(`${this.P.name}:${this.P.age}`)
.fontSize(80)
.fontWeight(FontWeight.Bold)
.fontColor("red")
.onClick(()=>{
this.P.name="李四"
this.P.age++
})
// 嵌套的对象点击视图不发生变化
Text(`${this.P.friend.name}:${this.P.friend.age}`)
.fontSize(80)
.fontWeight(FontWeight.Bold)
.fontColor("red")
.onClick(()=>{
this.P.friend.name="ss"
this.P.friend.age++
})
}
.width('100%')
}
.height('100%')
}
}
效果:
2.@State和@Prop单项数据同步(父向子传值)
①父组件
//2.引入子组件
import { AnLi }from "./AnLi"
@Entry
@Component
struct Index {
// 1.父组件声明变量
@State a:number=0
build() {
Stack(){
Column(){
// 3.父向子传值
AnLi({a:this.a})
Button("点击").onClick(()=>{
this.a++
})
}.height("30%").width("100%").backgroundColor("green")
}.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
}}
②子组件
@Component
export struct AnLi {
//4.@prop接收父组件传过来的变量
@Prop a:number
build(){
Column(){
Text( `${this.a}`)
}
}}
2.@State和@Link数据双向同步
①父组件
//2.引入子组件
import { AnLi }from "./AnLi"
@Entry
@Component
struct Index {
// 1.父组件声明变量
@State a:number=0
build() {
Stack(){
Column(){
Text( `${this.a}`)
// 3.父向子传值
AnLi({a:this.a})
Button("点击").onClick(()=>{
this.a++
})
}.height("30%").width("100%").backgroundColor("green")
}.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
}}
②子组件
@Component
export struct AnLi {
//4.@Link接收父组件传过来的变量
@Link a:number
build(){
Column(){
Text( `${this.a}`)
}
}}
效果如下:
3.@Provide和@Consume与后代组件双向同步例子如下:
//入口组件,根组件
import { AnLi }from "./AnLi"
@Entry
@Component
struct Index {
@Provide a:number=1
build() {
Stack(){
Column(){
AnLi()
}.height("30%").width("100%").backgroundColor("green")
}.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
}}
//父组件
import { Consum }from "./Consum"
@Component
export struct AnLi {
build(){
Column(){
Consum()
}
}}
//子组件
@Component
export struct Consum {
@Consume a:number
build(){
Column(){
Text( `${this.a}`)
Text( `${this.a}`)
Button("加以").onClick(()=>{
this.a++
})
}
}}
效果如下:
4.@objectLink和@observed装饰器用于在涉及嵌套对象或数组元素为对象的场景中进行双向数据同步
@Observed
class ClassA {
public c: number;
constructor(c: number) {
this.c = c;
}
}
@Observed
class ClassB {
public a: ClassA;
constructor(a: ClassA) {
this.a = a;
}
}
@Component
struct ComB{
@ObjectLink a:ClassA;
build(){
Button(`ViewA this.a.c=${this.a.c} +1`)
.onClick(() => {
this.a.c += 1;
})
}
}
@Entry
@Component
struct Index {
@State b: ClassB = new ClassB(new ClassA(0));
build() {
Stack(){
Column(){
ComB({a:this.b.a})
}.height("30%").width("100%").backgroundColor("green")
}.height("50%").width("100%").backgroundColor("red").alignContent(Alignment.Center)
}}
效果如下: