• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# arkui子系统ChangeLog
2
3## cl.arkui.1 状态变量数据类型声明使用限制
4
51. 所有的状态装饰器变量需要显式声明变量类型,不允许声明any,不支持Date数据类型。
6
7    示例:
8
9    ```ts
10    // xxx.ets
11    @Entry
12    @Component
13    struct DatePickerExample {
14      // 错误写法: @State isLunar: any = false
15      @State isLunar: boolean = false
16      // 错误写法: @State selectedDate: Date = new Date('2021-08-08')
17      private selectedDate: Date = new Date('2021-08-08')
18
19      build() {
20        Column() {
21          Button('切换公历农历')
22            .margin({ top: 30 })
23            .onClick(() => {
24              this.isLunar = !this.isLunar
25            })
26          DatePicker({
27            start: new Date('1970-1-1'),
28            end: new Date('2100-1-1'),
29            selected: this.selectedDate
30          })
31            .lunar(this.isLunar)
32            .onChange((value: DatePickerResult) => {
33              this.selectedDate.setFullYear(value.year, value.month, value.day)
34              console.info('select current date is: ' + JSON.stringify(value))
35            })
36
37        }.width('100%')
38      }
39    }
40    ```
41
42    ![datePicker](../../../application-dev/reference/arkui-ts/figures/datePicker.gif)
43
442. @State、@Provide、 @Link和@Consume四种状态变量的数据类型声明只能由简单数据类型或引用数据类型的其中一种构成。
45
46    类型定义中的Length、ResourceStr、ResourceColor三个类型是简单数据类型或引用数据类型的组合,所以不能被以上四种状态装饰器变量使用。
47    Length、ResourceStr、ResourceColor的定义请看文档[arkui-ts类型定义](../../../application-dev/reference/arkui-ts/ts-types.md)。
48
49    示例:
50
51    ```ts
52    // xxx.ets
53    @Entry
54    @Component
55    struct IndexPage {
56      // 错误写法: @State message: string | Resource = 'Hello World'
57      @State message: string = 'Hello World'
58      // 错误写法: @State message: ResourceStr = $r('app.string.hello')
59      @State resourceStr: Resource = $r('app.string.hello')
60
61      build() {
62        Row() {
63          Column() {
64            Text(`${this.message}`)
65              .fontSize(50)
66              .fontWeight(FontWeight.Bold)
67          }
68          .width('100%')
69        }
70        .height('100%')
71      }
72    }
73    ```
74
75    ![hello](../../../application-dev/quick-start/figures/hello.PNG)
76
77**变更影响**
78
791. 如果状态装饰器变量没有显式声明变量类型,声明any,编译拦截报错;
80    ```ts
81    // ArkTS:ERROR Please define an explicit type, not any.
82    @State isLunar: any = false
83    ```
842. 状态装饰器变量声明变量类型为Date,编译拦截报错;
85    ```ts
86    // ArkTS:ERROR The @State property 'selectedDate' cannot be a 'Date' object.
87    @State selectedDate: Date = new Date('2021-08-08')
88    ```
893. @State、@Provide、 @Link和@Consume四种状态变量使用框架提供的Length、ResourceStr、ResourceColor,
90    编译拦截报错。
91    ```ts
92    /* ArkTS:ERROR The state variable type here is 'ResourceStr', it contains both a simple type and an object type,
93      which are not allowed to be defined for state variable of a struct.*/
94    @State message: ResourceStr = $r('app.string.hello')
95    ```
96
97**关键的接口/组件变更**
98
99不涉及。
100
101**适配指导**
102
1031. 状态装饰器变量声明具体的变量类型替代any;
1042. 使用Date对象的状态装饰器变量,修改为不加状态装饰器修饰的常规变量;
1053. 因为Length(string|number|Resource), ResourceStr(string|Resource), ResourceColor(string|number|Color|Resource)
106    的三个类型是简单数据类型或引用数据类型的组合,使用@State、@Provide、 @Link和@Consume四种状态变量场景参考以下修改:
107    ```ts
108    // 错误写法:
109    @State message: ResourceStr = $r('app.string.hello')
110    // 修正后的写法:
111    @State resourceStr: Resource = $r('app.string.hello')
112    ```
113
114
115## cl.arkui.2 自定义组件成员变量初始化的规则与约束
116
117通过构造函数方法初始化成员变量,需要遵循如下规则:
118
119| **从父组件中的变量(右)到子组件中的变量(下)** | **regular** | **@State** | **@Link** | **@Prop** | **@Provide** | **@Consume** | **@ObjectLink** |
120|---------------------------------|----------------------------|------------|-----------|-----------|--------------|--------------|------------------|
121| **regular**                    | 支持                         | 支持         | 支持        | 支持        | 不支持            | 不支持            | 支持               |
122| **@State**                     | 支持                         | 支持         | 支持        | 支持        | 支持           | 支持           | 支持               |
123| **@Link**                      | 不支持                          | 支持(1)      | 支持(1)     | 支持(1)     | 支持(1)        | 支持(1)        | 支持(1)            |
124| **@Prop**                      | 支持                         | 支持         | 支持        | 支持        | 支持           | 支持           | 支持               |
125| **@Provide**                   | 支持                         | 支持         | 支持        | 支持        | 支持           | 支持           | 支持               |
126| **@Consume**                   | 不支持                          | 不支持          | 不支持         | 不支持         | 不支持            | 不支持            | 不支持                |
127| **@ObjectLink**                | 不支持                          | 不支持      | 不支持         | 不支持         | 不支持            | 不支持            | 不支持                |
128
129| **从父组件中的变量(右)到子组件中的变量(下)** | **@StorageLink** | **@StorageProp** | **@LocalStorageLink** | **@LocalStorageProp** |
130|------------------|------------------|------------------|-----------------------|------------------------|
131| **regular**                   | 支持               | 不支持                | 不支持                     | 不支持              |
132| **@State**                    | 支持               | 支持               | 支持                    | 支持                     |
133| **@Link**                     | 支持(1)            | 支持(1)            | 支持(1)                 | 支持(1)                  |
134| **@Prop**                     | 支持               | 支持               | 支持                    | 支持                     |
135| **@Provide**                  | 支持               | 支持               | 支持                    | 支持                     |
136| **@Consume**                  | 不支持             | 不支持              | 不支持                  | 不支持                   |
137| **@ObjectLink**               | 不支持             | 不支持              | 不支持                  | 不支持                   |
138
139> **说明**
140>
141> **支持(1)**:必须使用`$`, 例如 `this.$varA`。
142> **regular**:未加修饰的常规变量。
143
144不允许从父组件初始化`@StorageLink`, `@StorageProp`, `@LocalStorageLink`, `@LocalStorageProp`修饰的变量。
145
146**变更影响**
147
1481. 不允许从父组件初始化`@LocalStorageLink`, `@LocalStorageProp`修饰的变量。
149    ```ts
150    @Entry
151    @Component
152    struct LocalStorageComponent {
153        build() {
154            Column() {
155                Child({
156                  /* ArkTS:ERROR Property 'simpleVarName' in the custom component 'Child' cannot
157                    initialize here (forbidden to specify). */
158                  simpleVarName: 1,
159                  /* ArkTS:ERROR Property 'objectName' in the custom component 'Child' cannot
160                    initialize here (forbidden to specify). */
161                  objectName: new ClassA("x")
162                })
163            }
164        }
165    }
166    @Component
167    struct Child {
168        @LocalStorageLink("storageSimpleProp") simpleVarName: number = 0;
169        @LocalStorageProp("storageObjectProp") objectName: ClassA = new ClassA("x");
170        build() {}
171    }
172    ```
1732. 子组件的@ObjectLink变量不支持父组件装饰器变量的直接赋值,其父组件的源必须是数组的项或对象的属性,该数组或对象必现用`@State`、`@Link`、`@Provide`、`@Consume`或`@ObjectLink`装饰器修饰。
174    ```ts
175    let NextID : number = 0;
176
177    @Observed class ClassA {
178      public id : number;
179      public c: number;
180      constructor(c: number) {
181        this.id = NextID++;
182        this.c = c;
183      }
184    }
185
186    @Component
187    struct Child {
188      @ObjectLink varA : ClassA;
189      build() {
190        Row() {
191          Text('ViewA-' + this.varA.id)
192        }
193      }
194    }
195
196    @Component
197    struct Parent {
198      @Link linkValue: ClassA
199      build() {
200        Column() {
201          /* ArkTS:ERROR The @Link property 'linkValue' cannot be assigned to
202            the @ObjectLink property 'varA'.*/
203          Child({ varA: this.linkValue })
204        }
205      }
206    }
207    ```
208
209**关键的接口/组件变更**
210
211不涉及。
212
213**适配指导**
2141. 构造子组件时,不对子组件的`@LocalStorageLink`, `@LocalStorageProp`修饰的变量进行。
215如果需要在父组件中修改子组件的`@LocalStorageLink`, `@LocalStorageProp`修饰的变量,则使用LocalStorage提供的API接口方法(比如set方法)赋值。
2162. @ObjectLink的使用指导请参考文档[@ObjectLink使用指导](../../../application-dev/quick-start/arkts-state-mgmt-page-level.md)。
217
218
219## cl.arkui.LocalStorage.1 get接口返回类型变更
220
221**变更影响**
222
223返回类型从get<T>(propName: string): T变更为get<T>(propName: string): T | undefined
224应用不需要进行适配。
225
226## cl.arkui.LocalStorage.2 setOrCreate参数newValue变成必选
227**变更影响**
228
229原接口声明:
230```js
231setOrCreate<T>(propName: string, newValue?: T): boolean
232```
233现接口声明:
234```js
235setOrCreate<T>(propName: string, newValue: T): boolean
236```
237第二个参数newValue变为必选。
238如果应用调用这个接口没有指定newValue参数,在替换新的sdk后会编译不过,需要手动指定newValue。
239
240**适配指导**
241
242```js
243let storage = new LocalStorage();
244storage.setOrCreate('propA', 'hello');
245```
246## cl.arkui.LocalStorage.3 link参数和返回类型变更
247**变更影响**
248
249原接口声明:
250```js
251link<T>(propName: string, linkUser?: T, subscribersName?: string): T
252```
253现接口声明:
254```js
255link<T>(propName: string): SubscribedAbstractProperty<T>
256```
2571. link第二三个参数为框架内部调用,不应对外开发,所以将接口变更为一个参数;
2582. 返回类型T变更为SubscribedAbstractProperty;
259
260**适配指导**
261
262```js
263let storage = new LocalStorage({"PropA": "47"});
264let linA = storage.link("PropA");
265linA.set(50);
266```
267
268## cl.arkui.LocalStorage.4 setAndLink参数和返回类型变更
269**变更影响**
270
271原接口声明:
272```js
273setAndLink<T>(propName: string, defaultValue: T, linkUser?: T, subscribersName?: string): T
274```
275现接口声明:
276```js
277setAndLink<T>(propName: string, defaultValue: T): SubscribedAbstractProperty<T>
278```
2791. setAndLink第三四个参数为框架内部调用,不应对外开发,所以将接口变更为2个参数;
2802. 返回类型T变更为SubscribedAbstractProperty;
281
282**适配指导**
283
284```js
285let storage = new LocalStorage({"PropA": "47"});
286let linA = storage.setAndLink("PropA", "48")
287linA.set(50);
288```
289
290## cl.arkui.LocalStorage.5 prop参数和返回类型变更
291**变更影响**
292
293原接口声明:
294```js
295prop<T>(propName: string, propUser?: T, subscribersName?: string): T
296```
297现接口声明:
298```js
299prop<S>(propName: string): SubscribedAbstractProperty<S>
300```
3011. prop第二三个参数为框架内部调用,不应对外开发,所以将接口变更为1个参数;
3022. 返回类型T变更为SubscribedAbstractProperty;
303
304**适配指导**
305
306```js
307let storage = new LocalStorage({"PropA": "47"});
308let propA = storage.prop("PropA");
309propA.set(51); // one-way sync
310```
311
312## cl.arkui.LocalStorage.6 setAndProp参数和返回类型变更
313**变更影响**
314
315原接口声明:
316```js
317setAndProp<T>(propName: string, defaultValue: T, propUser?: T, subscribersName?: string): T
318```
319现接口声明:
320```js
321setAndProp<S>(propName: string, defaultValue: S): SubscribedAbstractProperty<S>
322```
3231. setAndProp第三四个参数为框架内部调用,不应对外开发,所以将接口变更为2个参数;
3242. 返回类型T变更为SubscribedAbstractProperty;
325
326**适配指导**
327
328```js
329let storage = new LocalStorage({"PropA": "47"});
330let propA = storage.setAndProp("PropA", "48");
331propA.set(51); // one-way sync
332```
333