You need to sign in or sign up before continuing.
ts-component-states-state.md 3.3 KB
Newer Older
Z
zengyawen 已提交
1
# @State
Z
zengyawen 已提交
2

Z
zengyawen 已提交
3
**@State**装饰的变量是组件内部的状态数据,当这些状态数据被修改时,将会调用所在组件的**build**方法进行UI刷新。
Z
zengyawen 已提交
4

Z
zengyawen 已提交
5
**@State**状态数据具有以下特征:
Z
zengyawen 已提交
6 7


Z
zengyawen 已提交
8 9 10 11 12 13 14 15 16 17 18 19
- **支持多种类型:**允许**class****number****boolean****string**强类型的按值和按引用类型。允许这些强类型构成的数组,即**Array<class>****Array<string>****Array<boolean>****Array<number>。**不允许**object****any。**

- **支持多实例:**组件不同实例的内部状态数据独立。

- **内部私有:**标记为**@State**的属性是私有变量,只能在组件内访问。

- **需要本地初始化:**必须为所有**@State**变量分配初始值,将变量保持未初始化可能导致框架行为未定义。

- **创建自定义组件时支持通过状态变量名设置初始值:**在创建组件实例时,可以通过变量名显式指定**@State**状态属性的初始值**。**


## 简单类型的状态属性示例
Z
zengyawen 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

```
@Entry
@Component
struct MyComponent {
    @State count: number = 0
    // MyComponent provides a method for modifying the @State status data member.
    private toggleClick() {
        this.count += 1
    }

    build() {
        Column() {
            Button() {
                Text(`click times: ${this.count}`)
                    .fontSize(10)
            }.onClick(this.toggleClick.bind(this))
        }
    }
}
```

Z
zengyawen 已提交
42 43

## 复杂类型的状态变量示例
Z
zengyawen 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

```
// Customize the status data class.
class Model {
    value: string
    constructor(value: string) {
        this.value = value
    }
}

@Entry
@Component
struct EntryComponent {
    build() {
        Column() {
Z
zengyawen 已提交
59
            MyComponent({count: 1, increaseBy: 2})  // MyComponent1 in this document            MyComponent({title: {value: 'Hello, World 2'}, count: 7})   //MyComponent2 in this document
Z
zengyawen 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
        }
    }
}

@Component
struct MyComponent {
    @State title: Model = {value: 'Hello World'}
    @State count: number = 0
    private toggle: string = 'Hello World'
    private increaseBy: number = 1

    build() {
        Column() {
            Text(`${this.title.value}`).fontSize(30)
            Button() {
                Text(`Click to change title`).fontSize(20).fontColor(Color.White)
            }.onClick(() => {
                this.title.value = (this.toggle == this.title.value) ? 'Hello World' : 'Hello UI'
            }) // Modify the internal state of MyComponent using the anonymous method.

            Button() {
                Text(`Click to increase count=${this.count}`).fontSize(20).fontColor(Color.White)
            }.onClick(() => {
                this.count += this.increaseBy
            }) // Modify the internal state of MyComponent using the anonymous method.
        }
    }
}
```

Z
zengyawen 已提交
90

Z
zengyawen 已提交
91 92 93
在上述示例中:


Z
zengyawen 已提交
94 95 96
- 用户定义的组件**MyComponent**定义了**@State**状态变量**count****title**。如果**count****title**的值发生变化,则执行**MyComponent****build**方法来重新渲染组件;

- **EntryComponent**中有多个**MyComponent**组件实例,第一个**MyComponent**内部状态的更改不会影响第二个**MyComponent**
Z
zengyawen 已提交
97

Z
zengyawen 已提交
98 99 100 101
- 创建**MyComponent**实例时通过变量名给组件内的变量进行初始化,如:
  ```
  MyComponent({title: {value: 'Hello, World 2'}, count: 7})
  ```