1# AttributeUpdater 2 3将属性直接设置给组件,无需标记为状态变量即可直接触发UI更新。 4 5> **说明:** 6> 7> 从API Version 12开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8> 9 10 11## 导入模块 12 13```ts 14import { AttributeUpdater } from '@kit.ArkUI' 15``` 16 17> **使用说明:** 18> 19> 1. 由于与属性方法同时设置或者在AttributeUpdater中实现applyNormalAttribute等方法时,涉及到与状态管理更新机制同时使用,易出现混淆,因此不建议在同一组件上同时用两种方法设置相同属性。 20> 21> 2. 当与属性方法同时设置时,属性生效的原则为:后设置的生效。 22> 若先进行属性直通更新,后通过状态管理机制更新属性方法,则后更新的属性方法生效; 23> 若先通过状态管理机制更新属性方法,后进行属性直通更新,则属性直通更新生效。 24> 25> 3. 一个AttributeUpdater对象只能同时关联一个组件,否则将出现设置的属性只在一个组件上生效的现象。 26> 27> 4. 开发者需要自行保障AttributeUpdater中T和C的类型匹配。比如T为ImageAttribute,C要对应为ImageInterface,否则可能导致 28> 使用updateConstructorParams时功能异常。 29> 30> 5. updateConstructorParams当前只支持Button,Image,Text和Span组件。 31> 32> 6. AttributeUpdater不支持深浅色切换等状态管理相关的操作。 33 34## Initializer 35type Initializer\<T> = () => T 36 37可以将属性更新到本地的修饰器。 38 39**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 40 41**系统能力:** SystemCapability.ArkUI.ArkUI.Full 42 43## AttributeUpdater<T, C = Initializer\<T>> 44为[AttributeModifier](arkui-ts/ts-universal-attributes-attribute-modifier.md#AttributeModifier)的实现类,开发者需要自定义class继承AttributeUpdater。 45 46其中C代表组件的构造函数类型,比如Text组件的TextInterface,Image组件的ImageInterface等,需要使用updateConstructorParams时才需要传递C类型。 47 48**系统能力:** SystemCapability.ArkUI.ArkUI.Full 49 50### applyNormalAttribute 51applyNormalAttribute?(instance: T): void 52 53定义正常态更新属性函数。 54 55**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 56 57**系统能力:** SystemCapability.ArkUI.ArkUI.Full 58 59**参数:** 60 61| 参数名 | 类型 | 必填 | 说明 | 62| ------ | ------ | ---- | ------------------------------------------------------------------------ | 63| instance | T | 是 | 组件的属性类,用来标识进行属性设置的组件的类型,比如Button组件的ButtonAttribute,Text组件的TextAttribute等。| 64 65### initializeModifier 66initializeModifier(instance: T): void 67 68AttributeUpdater首次设置给组件时提供的样式。 69 70**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 71 72**系统能力:** SystemCapability.ArkUI.ArkUI.Full 73 74**参数:** 75 76| 参数名 | 类型 | 必填 | 说明 | 77| ------ | ------ | ---- | ------------------------------------------------------------------------ | 78| instance | T | 是 | 组件的属性类,用来标识进行属性设置的组件的类型,比如Button组件的ButtonAttribute,Text组件的TextAttribute等。| 79 80**示例:** 81 82通过initializeModifier方法初始化设置属性值。 83 84```ts 85// xxx.ets 86import { AttributeUpdater } from '@kit.ArkUI' 87 88class MyButtonModifier extends AttributeUpdater<ButtonAttribute> { 89 initializeModifier(instance: ButtonAttribute): void { 90 instance.backgroundColor('#ff2787d9') 91 .width('50%') 92 .height(30) 93 } 94} 95 96@Entry 97@Component 98struct updaterDemo1 { 99 modifier: MyButtonModifier = new MyButtonModifier() 100 101 build() { 102 Row() { 103 Column() { 104 Button("Button") 105 .attributeModifier(this.modifier) 106 } 107 .width('100%') 108 } 109 .height('100%') 110 } 111} 112``` 113 114 115 116### attribute 117get attribute(): T | undefined 118 119获取AttributeUpdater中组件对应的属性类实例,通过该实例实现属性直通更新的功能。 120 121**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 122 123**系统能力:** SystemCapability.ArkUI.ArkUI.Full 124 125**返回值:** 126 127| 类型 | 描述 | 128| -------------------- | ------------------------------------------------------------ | 129| T \| undefined |如果AttributeUpdater中组件的属性类实例存在,则返回对应组件的属性类实例,否则返回undefined。| 130 131**示例:** 132 133通过属性直通设置方式更新属性值。 134 135```ts 136// xxx.ets 137import { AttributeUpdater } from '@kit.ArkUI' 138 139class MyButtonModifier extends AttributeUpdater<ButtonAttribute> { 140 initializeModifier(instance: ButtonAttribute): void { 141 instance.backgroundColor('#ffd5d5d5') 142 .width('50%') 143 .height(30) 144 } 145} 146 147@Entry 148@Component 149struct updaterDemo2 { 150 modifier: MyButtonModifier = new MyButtonModifier() 151 152 build() { 153 Row() { 154 Column() { 155 Button("Button") 156 .attributeModifier(this.modifier) 157 .onClick(() => { 158 this.modifier.attribute?.backgroundColor('#ff2787d9').width('30%') 159 }) 160 } 161 .width('100%') 162 } 163 .height('100%') 164 } 165} 166``` 167 168 169### updateConstructorParams 170updateConstructorParams: C 171 172用来更改组件的构造入参。C代表组件的构造函数类型。 173 174其中C代表组件的构造函数类型,比如Text组件的TextInterface,Image组件的ImageInterface等。 175 176**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 177 178**系统能力:** SystemCapability.ArkUI.ArkUI.Full 179 180**示例:** 181 182使用updateConstructorParams更新组件构造入参。 183 184```ts 185// xxx.ets 186import { AttributeUpdater } from '@kit.ArkUI' 187 188class MyTextModifier extends AttributeUpdater<TextAttribute, TextInterface> { 189 initializeModifier(instance: TextAttribute) { 190 } 191} 192 193@Entry 194@Component 195struct attributeDemo3 { 196 private modifier: MyTextModifier = new MyTextModifier() 197 198 build() { 199 Row() { 200 Column() { 201 Text("Initialize") 202 .attributeModifier(this.modifier) 203 .fontSize(14).border({ width: 1 }).textAlign(TextAlign.Center).lineHeight(20) 204 .width(200).height(50) 205 .backgroundColor('#fff7f7f7') 206 .onClick(() => { 207 this.modifier.updateConstructorParams("Updated") 208 }) 209 } 210 .width('100%') 211 } 212 .height('100%') 213 } 214} 215``` 216 217 218### onComponentChanged 219 220onComponentChanged(component: T): void 221 222绑定相同的自定义的Modifier对象,组件发生切换时,通过该接口通知到应用。 223 224**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 225 226**系统能力:** SystemCapability.ArkUI.ArkUI.Full 227 228**参数:** 229 230| 参数名 | 类型 | 必填 | 说明 | 231| ------ | ------ | ---- | ------------------------------------------------------------------------ | 232| component | T | 是 | 组件的属性类,用来标识进行属性设置的组件的类型,比如Button组件的ButtonAttribute,Text组件的TextAttribute等。| 233 234**示例:** 235 236```ts 237// xxx.ets 238import { AttributeUpdater } from '@kit.ArkUI' 239 240class MyButtonModifier extends AttributeUpdater<ButtonAttribute> { 241 initializeModifier(instance: ButtonAttribute): void { 242 instance.backgroundColor('#ff2787d9') 243 .width('50%') 244 .height(30) 245 } 246 247 onComponentChanged(instance: ButtonAttribute) :void { 248 instance.backgroundColor('#ff2787d9') 249 .width('50%') 250 .height(30) 251 } 252} 253 254@Entry 255@Component 256struct updaterDemo4 { 257 @State btnState: boolean = false 258 modifier: MyButtonModifier = new MyButtonModifier() 259 260 build() { 261 Row() { 262 Column() { 263 Button("Test") 264 .onClick(() => { 265 this.btnState = !this.btnState 266 }) 267 268 if (this.btnState) { 269 Button("Button") 270 .attributeModifier(this.modifier) 271 } else { 272 Button("Button") 273 .attributeModifier(this.modifier) 274 } 275 } 276 .width('100%') 277 } 278 .height('100%') 279 } 280} 281```