鸿蒙API14开发【动态属性设置】ArkTS组件
从API version 12开始,开发者可使用自定义Modifier构建组件并配置属性,通过此自定义的Modifier可调用所封装组件的属性和样式接口。未暴露的组件Modifier可以使用CommonModifier。注意事项设置自定义Modifier给一个组件,该组件对应属性生效。自定义Modifier属性值变化,组件对应属性也会变化。自定义Modifier类型为基类,构造的对象为子类对象,使
动态设置组件的属性,支持开发者在属性设置时使用if/else语法,且根据需要使用多态样式设置属性。
说明:
从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
在attributeModifier中设置的属性尽量不要与其他方法设置的属性相同,避免在页面刷新时attributeModifier不生效。
attributeModifier不支持自定义组件。
attributeModifier
attributeModifier(modifier: AttributeModifier)
动态设置组件的属性方法。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
modifier | [AttributeModifier] | 是 | 在当前组件上,动态设置属性方法,支持使用if/else语法。 modifier: 属性修改器,开发者需要自定义class实现AttributeModifier接口。 |
AttributeModifier
开发者需要自定义class实现AttributeModifier接口。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
applyNormalAttribute
applyNormalAttribute(instance: T) : void
组件普通状态时的样式。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
applyPressedAttribute
applyPressedAttribute(instance: T) : void
组件按压状态的样式。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
applyFocusedAttribute
applyFocusedAttribute(instance: T) : void
组件获焦状态的样式。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
applyDisabledAttribute
applyDisabledAttribute(instance: T) : void
组件禁用状态的样式。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
applySelectedAttribute
applySelectedAttribute(instance: T) : void
组件选中状态的样式。
开发者可根据需要自定义实现这些方法,通过传入的参数识别组件类型,对instance设置属性,支持使用if/else语法进行动态设置。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
参数 | 描述 |
---|---|
instance | 组件的属性类,用来标识进行属性设置的组件的类型,比如Button组件的ButtonAttribute,Text组件的TextAttribute等。 |
instance参数支持范围:
AlphabetIndexerAttribute、BadgeAttribute、BlankAttribute、ButtonAttribute、CalendarPickerAttribute、CanvasAttribute、CheckboxAttribute、CheckboxGroupAttribute、CircleAttribute、ColumnAttribute、ColumnSplitAttribute、ShapeAttribute、CommonAttribute、CounterAttribute、DataPanelAttribute、DatePickerAttribute、DividerAttribute、EllipseAttribute、FlexAttribute、FlowItemAttribute、FormLinkAttribute、GaugeAttribute、GridAttribute、GridColAttribute、ColumnAttribute、GridItemAttribute、GridRowAttribute、HyperlinkAttribute、ImageAttribute、ImageAnimatorAttribute、ImageSpanAttribute、LineAttribute、ListAttribute、ListItemAttribute、ListItemGroupAttribute、LoadingProgressAttribute、MarqueeAttribute、MenuAttribute、MenuItemAttribute、MenuItemGroupAttribute、NavDestinationAttribute、NavigationAttribute、NavigatorAttribute、NavRouterAttribute、PanelAttribute、PathAttribute、PatternLockAttribute、PolygonAttribute、PolylineAttribute、ProgressAttribute、QRCodeAttribute、RadioAttribute、RatingAttribute、RectAttribute、RefreshAttribute、RelativeContainerAttribute、RichEditorAttribute、RichTextAttribute、RowAttribute、RowSplitAttribute、ScrollAttribute、ScrollBarAttribute、SearchAttribute、SelectAttribute、ShapeAttribute、SideBarContainerAttribute、SliderAttribute、SpanAttribute、StackAttribute、StepperAttribute、StepperItemAttribute、SwiperAttribute、SymbolGlyphAttribute、TabContentAttribute、TabsAttribute、TextAttribute、TextAreaAttribute、TextClockAttribute、TextInputAttribute、TextPickerAttribute、TextTimerAttribute、TimePickerAttribute、ToggleAttribute、VideoAttribute、WaterFlowAttribute、XComponentAttribute、ParticleAttribute、EffectComponentAttribute、FormComponentAttribute、PluginComponentAttribute、RemoteWindowAttribute、UIExtensionComponentAttribute。
属性支持范围:
- 不支持入参或者返回值为[CustomBuilder]的属性。
- 不支持入参为[modifier]类型的属性,具体为以下属性方法:[attributeModifier],[drawModifier]和[gestureModifier]。
- 不支持[animation]属性。
- 不支持[gesture]类型的属性。
- 不支持[stateStyles]属性。
- 不支持已废弃属性。
- 不支持系统组件属性。
不支持或者未实现的属性在使用时会抛出"Method not implemented."、"is not callable"等异常信息。具体Modifier支持范围同基类属性接口的支持范围。
自定义Modifier
从API version 12开始,开发者可使用自定义Modifier构建组件并配置属性,通过此自定义的Modifier可调用所封装组件的属性和样式接口。
自定义Modifier支持范围:
CommonModifier、ColumnModifier、ColumnSplitModifier、RowModifier、RowSplitModifier、SideBarContainerModifier、BlankModifier、DividerModifier、GridColModifier、GridRowModifier、NavDestinationModifier、NavigatorModifier、StackModifier、NavigationModifier、NavRouterModifier、StepperItemModifier、TabsModifier、GridModifier、GridItemModifier、ListModifier、ListItemModifier、ListItemGroupModifier、ScrollModifier、SwiperModifier、WaterFlowModifier、ButtonModifier、CounterModifier、TextPickerModifier、TimePickerModifier、ToggleModifier、CalendarPickerModifier、CheckboxModifier、CheckboxGroupModifier、DatePickerModifier、RadioModifier、RatingModifier、SelectModifier、SliderModifier、PatternLockModifier、SpanModifier、RichEditorModifier、RefreshModifier、SearchModifier、TextAreaModifier、TextModifier、TextInputModifier、ImageSpanModifier、ImageAnimatorModifier、ImageModifier、VideoModifier、DataPanelModifier、GaugeModifier、LoadingProgressModifier、MarqueeModifier、ProgressModifier、QRCodeModifier、TextClockModifier、TextTimerModifier、LineModifier、PathModifier、PolygonModifier、PolylineModifier、RectModifier、ShapeModifier、AlphabetIndexerModifier、FormComponentModifier、HyperlinkModifier、MenuModifier、MenuItemModifier、PanelModifier、SymbolGlyphModifier、ParticleModifier。
未暴露的组件Modifier可以使用CommonModifier。
注意事项
- 设置自定义Modifier给一个组件,该组件对应属性生效。
- 自定义Modifier属性值变化,组件对应属性也会变化。自定义Modifier类型为基类,构造的对象为子类对象,使用时要通过as进行类型断言为子类。
- 一个自定义Modifier设置给两个组件,Modifier属性变化的时候对两个组件同时生效。
- 一个Modifier设置了属性A和属性B,再设置属性C和属性D,4个属性同时在组件上生效。
- 自定义Modifier不支持@State标注的状态数据的变化感知,见示例2。
- 多次通过attributeModifier设置属性时,生效的属性为所有属性的并集,相同属性按照设置顺序生效。
示例
示例1(组件绑定Modifier切换背景颜色)
该示例通过Button绑定Modifier实现了点击切换背景颜色的效果。
// xxx.ets
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
isDark: boolean = false
applyNormalAttribute(instance: ButtonAttribute): void {
if (this.isDark) {
instance.backgroundColor(Color.Black)
} else {
instance.backgroundColor(Color.Red)
}
}
}
@Entry
@Component
struct attributeDemo {
@State modifier: MyButtonModifier = new MyButtonModifier()
build() {
Row() {
Column() {
Button("Button")
.attributeModifier(this.modifier)
.onClick(() => {
this.modifier.isDark = !this.modifier.isDark
})
}
.width('100%')
}
.height('100%')
}
}
ts
示例2(组件绑定Modifier实现按压态效果)
该示例通过Button绑定Modifier实现了按压态的效果。如果配合状态管理V2使用,详情见:[Modifier与makeObserved]。
// xxx.ets
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
applyNormalAttribute(instance: ButtonAttribute): void {
instance.backgroundColor(Color.Black)
}
applyPressedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor(Color.Red)
}
}
@Entry
@Component
struct attributePressedDemo {
@State modifier: MyButtonModifier = new MyButtonModifier()
build() {
Row() {
Column() {
Button("Button")
.attributeModifier(this.modifier)
}
.width('100%')
}
.height('100%')
}
}
ts
示例3(自定义Modifier不支持感知@State装饰的状态数据变化)
该示例通过状态数据设置自定义Modifier的宽度,自定义Modifier不支持感知@State装饰的状态数据变化,点击按钮后宽度不发生改变。
import { CommonModifier } from "@kit.ArkUI"
const TEST_TAG : string = "AttributeModifier";
class MyModifier extends CommonModifier {
applyNormalAttribute(instance: CommonAttribute): void {
super.applyNormalAttribute?.(instance);
}
}
@Component
struct MyImage1 {
@Link modifier: CommonModifier
build() {
Image($r("app.media.startIcon")).attributeModifier(this.modifier as MyModifier)
}
}
@Entry
@Component
struct Index {
index: number = 0;
@State width1: number = 100;
@State height1: number = 100;
@State myModifier: CommonModifier = new MyModifier().width(this.width1).height(this.height1).margin(10)
build() {
Column() {
Button($r("app.string.EntryAbility_label"))
.margin(10)
.onClick(() => {
console.log(TEST_TAG, "onClick")
this.index++;
if (this.index % 2 === 1) {
this.width1 = 10;
console.log(TEST_TAG, "setGroup1")
} else {
this.width1 = 10;
console.log(TEST_TAG, "setGroup2")
}
})
MyImage1({ modifier: this.myModifier })
}
.width('100%')
}
}
ts
示例4(Modifier和自定义Modifier的属性同时生效)
该示例通过自定义Modifier设置了width和height,点击按钮时设置borderStyle和borderWidth,点击后4个属性同时生效。
import { CommonModifier } from "@kit.ArkUI"
const TEST_TAG: string = "AttributeModifier";
class MyModifier extends CommonModifier {
applyNormalAttribute(instance: CommonAttribute): void {
super.applyNormalAttribute?.(instance);
}
public setGroup1(): void {
this.borderStyle(BorderStyle.Dotted)
this.borderWidth(8)
}
public setGroup2(): void {
this.borderStyle(BorderStyle.Dashed)
this.borderWidth(8)
}
}
@Component
struct MyImage1 {
@Link modifier: CommonModifier
build() {
Image($r("app.media.startIcon")).attributeModifier(this.modifier as MyModifier)
}
}
@Entry
@Component
struct Index {
@State myModifier: CommonModifier = new MyModifier().width(100).height(100).margin(10)
index: number = 0;
build() {
Column() {
Button($r("app.string.EntryAbility_label"))
.margin(10)
.onClick(() => {
console.log(TEST_TAG, "onClick")
this.index++;
if (this.index % 2 === 1) {
(this.myModifier as MyModifier).setGroup1()
console.log(TEST_TAG, "setGroup1")
} else {
(this.myModifier as MyModifier).setGroup2()
console.log(TEST_TAG, "setGroup2")
}
})
MyImage1({ modifier: this.myModifier })
}
.width('100%')
}
}
ts
Attribute支持范围
未在表格中列举的属性默认为支持。
表1 CommonAttribute属性接口支持例外范围
属性 | 支持情况 | 告警信息 | 备注 |
---|---|---|---|
accessibilityChecked | 不支持 | is not callable | - |
accessibilitySelected | 不支持 | is not callable | - |
accessibilityTextHint | 不支持 | is not callable | - |
accessibilityVirtualNode | 不支持 | is not callable | 不支持入参为CustomBuilder。 |
animation | 不支持 | Method not implemented. | 不支持animation相关属性。 |
attributeModifier | 不支持 | - | attributeModifier不支持嵌套使用,不生效。 |
background | 不支持 | Method not implemented. | 不支持入参为CustomBuilder。 |
backgroundFilter | 不支持 | is not callable | - |
bindContentCover | 不支持 | Method not implemented. | 不支持入参为CustomBuilder。 |
bindContextMenu | 不支持 | Method not implemented. | 不支持入参为CustomBuilder。 |
bindMenu | 不支持 | Method not implemented. | 不支持入参为CustomBuilder。 |
bindPopup | 不支持 | Method not implemented. | 不支持入参为CustomBuilder。 |
bindSheet | 不支持 | Method not implemented. | 不支持入参为CustomBuilder。 |
chainWeight | 不支持 | is not callable | - |
compositingFilter | 不支持 | is not callable | - |
drawModifier | 不支持 | is not callable | 不支持modifier相关的属性。 |
foregroundFilter | 不支持 | is not callable | - |
freeze | 不支持 | is not callable | - |
gesture | 不支持 | Method not implemented. | 不支持gesture相关的属性。 |
gestureModifier | 不支持 | is not callable | 不支持modifier相关的属性。 |
onAccessibilityHover | 不支持 | is not callable | - |
onChildTouchTest | 不支持 | is not callable | - |
onKeyEventDispatch | 不支持 | is not callable | - |
onPreDrag | 不支持 | Method not implemented. | - |
onTouchIntercept | 不支持 | is not callable | - |
onVisibleAreaChange | 不支持 | Method not implemented. | - |
parallelGesture | 不支持 | Method not implemented. | 不支持gesture相关的属性。 |
priorityGesture | 不支持 | Method not implemented. | 不支持gesture相关的属性。 |
reuseId | 不支持 | Method not implemented. | - |
safeAreaPadding | 不支持 | is not callable | - |
stateStyles | 不支持 | Method not implemented. | 不支持stateStyles相关的属性。 |
useSizeType | 不支持 | Method not implemented. | 不支持已废弃属性。 |
visualEffect | 不支持 | is not callable | - |
accessibilityDescription | 部分支持 | - | 不支持入参为Resource。 |
accessibilityText | 部分支持 | - | 不支持入参为Resource。 |
dragPreview | 部分支持 | Method not implemented. | 仅支持入参为string。 |
更多推荐
所有评论(0)