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