鸿蒙 6.1 API 23 开发坑系列篇 1:ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier<T> 状态化节点修改器根因
本文是「鸿蒙 6.1 API 23 开发坑系列」第 1 篇(ArkUI 桶第 1 篇)。鸿蒙 6.1 API 23 共 397 个 API namespace,本系列按类别分桶写几百篇,每篇一个具体 API namespace 真名坑。本篇讲
@ohos.arkui.modifiernamespace(API 12+,鸿蒙 6.1 API 23 基座)——74 个 Modifier 装饰器类,attributeModifier+AttributeModifier<T>状态化节点修改器根因。鸿蒙坑根因:applyNormalAttribute是方法声明不是属性——buttonModifier.applyNormalAttribute = fn编译错arkts-no-method-reassignment(ArkTS 禁止给对象方法重新赋值),正确用法是class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }+attributeModifier(myModifier)绑定。
一、开篇:鸿蒙 modifier 不是 React useReducer,是「节点属性修改器」
你写 React 时,组件状态管理用 useReducer(reducer 函数 + dispatch 派发动作):
// React useReducer:reducer 函数 + dispatch 派发动作(状态管理 hook)
function Button() {
const [state, dispatch] = useReducer((state, action) => {
if (action.type === 'toggle') {
return { fontSize: 20, bgColor: '#28a745', fontColor: '#ffffff' }
}
return { fontSize: 16, bgColor: '#2563eb', fontColor: '#ffffff' }
}, { fontSize: 16, bgColor: '#2563eb', fontColor: '#ffffff' })
// ❌ React useReducer:reducer 函数 + dispatch 派发动作(状态管理 hook,不是节点修改器)
return <button style={{ fontSize: state.fontSize, backgroundColor: state.bgColor }} onClick={() => dispatch({ type: 'toggle' })}>按钮</button>
}
你写鸿蒙 ArkTS 时,节点属性修改用 AttributeModifier<T> 装饰器(class implements + applyNormalAttribute 方法 + attributeModifier 绑定):
// ArkTS AttributeModifier:class implements + applyNormalAttribute 方法 + attributeModifier 绑定
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
fontSize: number = 16
bgColor: ResourceColor = '#2563eb'
fontColor: ResourceColor = '#ffffff'
// ✅ applyNormalAttribute 是方法声明(class implements AttributeModifier<T>,不是属性赋值)
applyNormalAttribute(instance: ButtonAttribute): void {
// ✅ instance 是 ButtonAttribute 实例,改属性用同名 setter 方法
instance.fontSize(this.fontSize)
instance.backgroundColor(this.bgColor)
instance.fontColor(this.fontColor)
}
// ✅ applyPressedAttribute 按下态(可选方法,状态化节点修改器多状态)
applyPressedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#dc3545')
instance.fontSize(22)
}
}
const myButtonModifier: MyButtonModifier = new MyButtonModifier()
@Entry
@Component
struct Index {
build() {
// ✅ attributeModifier 绑定装饰器实例到组件(鸿蒙坑:attributeModifier 绑定 AttributeModifier<T> 实例)
Button('受 MyButtonModifier 装饰器控制的按钮')
.attributeModifier(myButtonModifier)
}
}
React useReducer vs 鸿蒙 AttributeModifier 的区别:React 把状态管理当 reducer 函数(useReducer + dispatch 派发动作,状态管理 hook,声明式 UI),ArkTS 把节点属性修改当装饰器类(class implements AttributeModifier + applyNormalAttribute 方法改 instance 属性 + attributeModifier 绑定,节点属性修改器,命令式 setter)。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute 是方法声明改 instance 属性,attributeModifier 绑定装饰器实例到组件。
二、根因:鸿蒙 AttributeModifier 的绑定机制
鸿蒙 @ohos.arkui.modifier namespace(API 12+)有 74 个 Modifier 装饰器类,每个继承对应 Attribute 类 + 实现 AttributeModifier<XxxAttribute> interface,核心方法 applyNormalAttribute(instance: XxxAttribute): void 改属性。绑定机制来自四重根因。
机制 1:74 个 Modifier 类——extends XxxAttribute implements AttributeModifier
鸿蒙 74 个 Modifier 装饰器类,每个 extends 对应 Attribute 类 + implements AttributeModifier:
// ✅ ButtonModifier 类声明(extends ButtonAttribute implements AttributeModifier<ButtonAttribute>)
export declare class ButtonModifier extends ButtonAttribute implements AttributeModifier<ButtonAttribute> {
applyNormalAttribute?(instance: ButtonAttribute): void
}
// ✅ TextModifier 类声明(extends TextAttribute implements AttributeModifier<TextAttribute>)
export declare class TextModifier extends TextAttribute implements AttributeModifier<TextAttribute> {
applyNormalAttribute?(instance: TextAttribute): void
}
// ✅ 74 个 Modifier 类:ButtonModifier/TextModifier/ImageModifier/ColumnModifier/RowModifier/...
// ✅ 每个 extends 对应 Attribute 类 + implements AttributeModifier<XxxAttribute>
// 鸿蒙 74 个 Modifier 装饰器类:extends XxxAttribute implements AttributeModifier<XxxAttribute>
鸿蒙 Modifier 类清单(74 个):CommonModifier(基座)/ AlphabetIndexerModifier / BlankModifier / ButtonModifier / CalendarPickerModifier / CheckboxModifier / CheckboxGroupModifier / ColumnModifier / ColumnSplitModifier / CounterModifier / DataPanelModifier / DatePickerModifier / DividerModifier / GaugeModifier / GridModifier / GridColModifier / GridItemModifier / GridRowModifier / HyperlinkModifier / ImageAnimatorModifier / ImageModifier / SymbolGlyphModifier / ImageSpanModifier / LineModifier / ListModifier / ListItemModifier / ListItemGroupModifier / LoadingProgressModifier / MarqueeModifier / MenuModifier / MenuItemModifier / NavDestinationModifier / NavigationModifier / NavigatorModifier / NavRouterModifier / PanelModifier / PathModifier / PatternLockModifier / PolygonModifier / PolylineModifier / ProgressModifier / QRCodeModifier / RadioModifier / RatingModifier / RectModifier / RefreshModifier / RichEditorModifier / RowModifier / RowSplitModifier / ScrollModifier / SearchModifier / SelectModifier / ShapeModifier / SideBarContainerModifier / SliderModifier / SpanModifier / StackModifier / StepperItemModifier / SwiperModifier / TabsModifier / TextAreaModifier / TextModifier / TextClockModifier / TextInputModifier / TextPickerModifier / TextTimerModifier / TimePickerModifier / ToggleModifier / VideoModifier / WaterFlowModifier / ContainerSpanModifier / SymbolSpanModifier / ParticleModifier / StepperModifier。
机制 2:applyNormalAttribute 是方法声明不是属性——arkts-no-method-reassignment 编译错
鸿蒙坑根因:applyNormalAttribute 是方法声明不是属性——buttonModifier.applyNormalAttribute = fn 编译错:
// ❌ 鸿蒙坑:applyNormalAttribute 是方法不是属性,赋值覆盖编译错 arkts-no-method-reassignment
const buttonModifier: ButtonModifier = new ButtonModifier()
// ❌ ArkTS 禁止给对象方法重新赋值:buttonModifier.applyNormalAttribute = (instance) => { ... }
// ❌ 编译错:Reassigning object methods is not supported (arkts-no-method-reassignment)
// ✅ 正确用法:class implements AttributeModifier<T>,applyNormalAttribute 是方法声明
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
applyNormalAttribute(instance: ButtonAttribute): void {
instance.fontSize(20)
instance.backgroundColor('#28a745')
instance.fontColor('#ffffff')
}
}
// 鸿蒙坑根因:applyNormalAttribute 是方法声明不是属性,ArkTS 禁止给对象方法重新赋值
arkts-no-method-reassignment 编译错根因:ArkTS 语法规则禁止给对象方法重新赋值(obj.method = fn 非法),applyNormalAttribute 在 .d.ts 里声明为方法(applyNormalAttribute?(instance: ButtonAttribute): void),所以 buttonModifier.applyNormalAttribute = fn 触发 arkts-no-method-reassignment 编译错。正确用法是 class MyModifier implements AttributeModifier<T> 声明方法,不是赋值覆盖方法。
机制 3:attributeModifier(modifier) 绑定装饰器实例到组件
鸿蒙 attributeModifier(modifier) 绑定装饰器实例到组件(不是 attribute 是装饰器绑定):
// ✅ attributeModifier 绑定装饰器实例到组件(鸿蒙坑:attributeModifier 绑定 AttributeModifier<T> 实例)
const myButtonModifier: MyButtonModifier = new MyButtonModifier()
@Entry
@Component
struct Index {
build() {
// ✅ attributeModifier(modifier) 绑定装饰器实例到组件
Button('受 MyButtonModifier 装饰器控制的按钮')
.attributeModifier(myButtonModifier)
.onClick(() => {
// ✅ 装饰器控制的按钮点击,applyPressedAttribute 按下态触发
})
}
}
// attributeModifier 绑定装饰器实例到组件(不是 attribute 是装饰器绑定)
attributeModifier vs attribute 的区别:attributeModifier(modifier) 绑定的是 AttributeModifier<T> 实例(装饰器类实例,applyNormalAttribute 方法改 instance 属性),不是单个 attribute 值(fontSize/fontColor 等声明式属性)。装饰器绑定是命令式 setter(instance.fontSize()),声明式属性是声明式 UI(.fontSize(16))。
机制 4:applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法
鸿蒙 AttributeModifier<T> interface 有多个可选 apply 方法(Normal/Pressed/Focused 等多状态):
// ✅ applyXxxAttribute 多状态:Normal/Pressed/Focused 等可选方法
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
// ✅ applyNormalAttribute 正常态(必选)
applyNormalAttribute(instance: ButtonAttribute): void {
instance.fontSize(16)
instance.backgroundColor('#2563eb')
}
// ✅ applyPressedAttribute 按下态(可选,状态化节点修改器多状态)
applyPressedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#dc3545')
instance.fontSize(22)
}
// ✅ applyFocusedAttribute 聚焦态(可选,状态化节点修改器多状态)
applyFocusedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#ff6600')
instance.fontSize(18)
}
}
// applyXxxAttribute 多状态:Normal/Pressed/Focused 等可选方法
applyXxxAttribute 多状态方法:applyNormalAttribute(正常态,必选)/ applyPressedAttribute(按下态,可选)/ applyFocusedAttribute(聚焦态,可选)/ applyDisabledAttribute(禁用态,可选)/ applySelectedAttribute(选中态,可选)/ applyPointerOverAttribute(鼠标悬停态,可选)等。每个状态对应一个 apply 方法,instance 是对应 Attribute 实例,改属性用同名 setter。
三、真机配图:鸿蒙 ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier

真机配图展示鸿蒙 ArkUI.modifier 装饰器坑:
- 初始态:鸿蒙 6.1 ArkUI.modifier 装饰器坑标题,场景1卡片(受 MyButtonModifier 装饰器控制的按钮蓝色 fontSize=16 + ①toggle 按钮)、场景2卡片(受 MyTextModifier 装饰器控制的文本黑色 fontSize=14 + ②toggle 按钮)、鸿蒙坑卡片(arkts-no-method-reassignment 错误演示)、要点说明
- ButtonModifier toggle 态:点击「① toggle MyButtonModifier 状态」按钮,modifierStatus 显示「✅ MyButtonModifier 状态切换:toggle=true fontSize=20 bgColor=#28a745」,受装饰器控制的按钮已变绿色 fontSize=20——状态化节点修改器验证
- TextModifier toggle 态:点击「② toggle MyTextModifier 状态」按钮,受 MyTextModifier 装饰器控制的文本已变红色 fontSize=18——文本装饰器验证
- applyPressedAttribute 按下态:点击「受 MyButtonModifier 装饰器控制的按钮」,pressed=1,applyPressedAttribute 按下态触发(按钮变红色 fontSize=22)——按下态验证
四、真解法:鸿蒙 AttributeModifier 的三个场景
场景 1:class implements AttributeModifier + attributeModifier 绑定——90% 场景首选
class implements AttributeModifier + attributeModifier 绑定用 AttributeModifier<ButtonAttribute> + attributeModifier(modifier):
// ✅ 场景 1:class implements AttributeModifier<T> + attributeModifier 绑定(API 12,90% 场景首选)
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
fontSize: number = 16
bgColor: ResourceColor = '#2563eb'
fontColor: ResourceColor = '#ffffff'
// ✅ applyNormalAttribute 是方法声明(class implements AttributeModifier<T>,不是属性赋值)
applyNormalAttribute(instance: ButtonAttribute): void {
// ✅ instance 是 ButtonAttribute 实例,改属性用同名 setter 方法
instance.fontSize(this.fontSize)
instance.backgroundColor(this.bgColor)
instance.fontColor(this.fontColor)
}
}
const myButtonModifier: MyButtonModifier = new MyButtonModifier()
@Entry
@Component
struct Index {
build() {
// ✅ attributeModifier 绑定装饰器实例到组件
Button('受 MyButtonModifier 装饰器控制的按钮')
.attributeModifier(myButtonModifier)
}
}
// class implements AttributeModifier<T> + attributeModifier 绑定:90% 场景首选
鸿蒙 AttributeModifier API 真名坑:AttributeModifier<T> interface(API 12+,鸿蒙 6.1 API 23 基座);applyNormalAttribute(instance: T): void 正常态方法(必选);applyPressedAttribute(instance: T): void 按下态方法(可选);applyFocusedAttribute(instance: T): void 聚焦态方法(可选);applyDisabledAttribute(instance: T): void 禁用态方法(可选);applySelectedAttribute(instance: T): void 选中态方法(可选);attributeModifier(modifier: AttributeModifier<T>) 绑定装饰器实例到组件;74 个 Modifier 类 extends 对应 Attribute 类 implements AttributeModifier;SysCap SystemCapability.ArkUI.ArkUI.Full;@crossplatform 跨平台;@atomicservice 原子化服务。
场景 2:applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法
applyXxxAttribute 多状态用 applyPressedAttribute + applyFocusedAttribute 等可选方法:
// ✅ 场景 2:applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法(API 12)
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
applyNormalAttribute(instance: ButtonAttribute): void {
instance.fontSize(16)
instance.backgroundColor('#2563eb')
instance.fontColor('#ffffff')
}
// ✅ applyPressedAttribute 按下态(可选方法,状态化节点修改器多状态)
applyPressedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#dc3545')
instance.fontSize(22)
}
// ✅ applyFocusedAttribute 聚焦态(可选方法,状态化节点修改器多状态)
applyFocusedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#ff6600')
instance.fontSize(18)
}
}
// applyXxxAttribute 多状态:Normal/Pressed/Focused 等可选方法,instance 改属性用同名 setter
鸿蒙 applyXxxAttribute 多状态 API 真名坑:applyNormalAttribute(正常态,N 首字母大写驼峰命名);applyPressedAttribute(按下态,P 首字母大写);applyFocusedAttribute(聚焦态,F 首字母大写);applyDisabledAttribute(禁用态,D 首字母大写);applySelectedAttribute(选中态,S 首字母大写);applyPointerOverAttribute(鼠标悬停态,P 首字母大写);鸿蒙坑:applyNormalAttribute 大小写坑——Normal 不是 normal,首字母大写驼峰命名;instance 改属性用同名 setter 方法(instance.fontSize() / instance.backgroundColor() / instance.fontColor())。
场景 3:arkts-no-method-reassignment 编译错——applyNormalAttribute 是方法不是属性
arkts-no-method-reassignment 编译错——buttonModifier.applyNormalAttribute = fn 非法:
// ❌ 场景 3:arkts-no-method-reassignment 编译错——applyNormalAttribute 是方法不是属性
const buttonModifier: ButtonModifier = new ButtonModifier()
// ❌ ArkTS 禁止给对象方法重新赋值:buttonModifier.applyNormalAttribute = (instance) => { ... }
// ❌ 编译错:Reassigning object methods is not supported (arkts-no-method-reassignment)
// ❌ 错误信息:Error Message: Reassigning object methods is not supported (arkts-no-method-reassignment)
// ✅ 正确用法:class implements AttributeModifier<T>,applyNormalAttribute 是方法声明
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
applyNormalAttribute(instance: ButtonAttribute): void {
instance.fontSize(20)
instance.backgroundColor('#28a745')
instance.fontColor('#ffffff')
}
}
// arkts-no-method-reassignment 编译错根因:applyNormalAttribute 是方法声明不是属性,ArkTS 禁止给对象方法重新赋值
arkts-no-method-reassignment 编译错根因:ArkTS 语法规则禁止给对象方法重新赋值(obj.method = fn 非法,arkts-no-method-reassignment),applyNormalAttribute 在 .d.ts 里声明为方法(applyNormalAttribute?(instance: ButtonAttribute): void),所以 buttonModifier.applyNormalAttribute = fn 触发编译错。鸿蒙坑:applyNormalAttribute 是方法声明不是属性——不能赋值覆盖,必须 class implements AttributeModifier 声明方法。
五、一句话哲学
写鸿蒙 ArkUI 记住:modifier 不是 React.useReducer 是「节点属性修改器」——鸿蒙 6.1 API 23
@ohos.arkui.modifiernamespace(API 12+,74 个 Modifier 装饰器类,extends XxxAttribute implements AttributeModifier,SysCap SystemCapability.ArkUI.ArkUI.Full,@crossplatform @atomicservice)。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute(instance: T): void是方法声明不是属性(❌buttonModifier.applyNormalAttribute = fn编译错arkts-no-method-reassignment,ArkTS 禁止给对象方法重新赋值;✅ 正确用法class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }),attributeModifier(modifier)绑定装饰器实例到组件(不是 attribute 是装饰器绑定,命令式 setter),applyXxxAttribute多状态(Normal/Pressed/Focused/Disabled/Selected/PointerOver 等可选方法,首字母大写驼峰命名,instance 改属性用同名 setterinstance.fontSize()/instance.backgroundColor()/instance.fontColor())。节点属性修改器 applyNormalAttribute 是方法不是属性是鸿蒙 6.1 ArkUI.modifier 装饰器坑核心!
能力系列回链
- �鸿蒙 7.0 新特性篇 1~17(沉浸式毛玻璃/Component3D/智能体框架/方舟引擎/星盾安全/星河互联/空间音频/可变字体/游戏快启/分布式数据盾/LTPO 可变帧率/AI 文档识别/多形态服务窗口/AI 反诈/机密计算/空间计算/小艺全面进化)
- 鸿蒙 6.1 API 23 开发坑系列篇 1「ArkUI.modifier 装饰器坑」——attributeModifier + AttributeModifier 状态化节点修改器(本文)
真机 demo 完整代码
// 鸿蒙 6.1 API 23 开发坑系列篇 1:ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier<T> 状态化节点修改器根因
// 本 demo 用 attributeModifier 绑定 + 自定义 class implements AttributeModifier<ButtonAttribute> 演示鸿蒙 6.1 装饰器根因(本机 API 21 可跑)
// 鸿蒙坑根因:applyNormalAttribute 是方法不是属性——arkts-no-method-reassignment 禁止 buttonModifier.applyNormalAttribute = fn 赋值,必须 class implements AttributeModifier<T>
// ✅ 自定义 AttributeModifier<ButtonAttribute> 实现类(正确用法:class implements,不是赋值覆盖方法)
class MyButtonModifier implements AttributeModifier<ButtonAttribute> {
fontSize: number = 16
bgColor: ResourceColor = '#2563eb'
fontColor: ResourceColor = '#ffffff'
// ✅ applyNormalAttribute 是方法声明(class implements AttributeModifier<T>,不是属性赋值)
applyNormalAttribute(instance: ButtonAttribute): void {
// ✅ instance 是 ButtonAttribute 实例,改属性用同名 setter 方法
instance.fontSize(this.fontSize)
instance.backgroundColor(this.bgColor)
instance.fontColor(this.fontColor)
}
// ✅ applyPressedAttribute 按下态(可选方法,状态化节点修改器多状态)
applyPressedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#dc3545')
instance.fontSize(22)
}
// ✅ applyFocusedAttribute 聚焦态(可选方法,状态化节点修改器多状态)
applyFocusedAttribute(instance: ButtonAttribute): void {
instance.backgroundColor('#ff6600')
instance.fontSize(18)
}
}
// ✅ 自定义 AttributeModifier<TextAttribute> 实现类(文本装饰器)
class MyTextModifier implements AttributeModifier<TextAttribute> {
fontSize: number = 14
fontColor: ResourceColor = '#333333'
applyNormalAttribute(instance: TextAttribute): void {
instance.fontSize(this.fontSize)
instance.fontColor(this.fontColor)
}
}
// ✅ 全局 Modifier 实例(attributeModifier 绑定用)
const myButtonModifier: MyButtonModifier = new MyButtonModifier()
const myTextModifier: MyTextModifier = new MyTextModifier()
@Entry
@Component
struct Index {
@State log: string = '(未操作)'
@State modifierStatus: string = '(未用)'
@State toggleState: boolean = false
@State pressedCount: number = 0
@State focusedCount: number = 0
@State normalCount: number = 0
@State currentButtonFontSize: number = 16
@State currentButtonBgColor: string = '#2563eb'
aboutToAppear() {
this.log = '鸿蒙 6.1 ArkUI.modifier 装饰器坑:74 个 Modifier 类,attributeModifier + AttributeModifier<T> 状态化节点修改器'
}
// ✅ 场景 1:切换 MyButtonModifier 状态(改实例属性后刷新绑定)
toggleButtonState() {
this.toggleState = !this.toggleState
if (this.toggleState) {
myButtonModifier.fontSize = 20
myButtonModifier.bgColor = '#28a745'
myButtonModifier.fontColor = '#ffffff'
this.currentButtonFontSize = 20
this.currentButtonBgColor = '#28a745'
} else {
myButtonModifier.fontSize = 16
myButtonModifier.bgColor = '#2563eb'
myButtonModifier.fontColor = '#ffffff'
this.currentButtonFontSize = 16
this.currentButtonBgColor = '#2563eb'
}
this.modifierStatus = '✅ MyButtonModifier 状态切换:toggle=' + this.toggleState + ' fontSize=' + myButtonModifier.fontSize + ' bgColor=' + this.currentButtonBgColor
this.log = '✅ MyButtonModifier 实例属性切换成功(applyNormalAttribute 下次渲染按新属性改节点)'
this.normalCount++
}
// ✅ 场景 2:切换 MyTextModifier 状态
toggleTextState() {
if (myTextModifier.fontSize === 14) {
myTextModifier.fontSize = 18
myTextModifier.fontColor = '#dc3545'
} else {
myTextModifier.fontSize = 14
myTextModifier.fontColor = '#333333'
}
this.modifierStatus = '✅ MyTextModifier 状态切换:fontSize=' + myTextModifier.fontSize
this.log = '✅ MyTextModifier 实例属性切换成功(applyNormalAttribute 下次渲染按新属性改节点)'
}
build() {
Column({ space: 8 }) {
Text('鸿蒙 6.1 ArkUI.modifier 装饰器坑')
.fontSize(18).fontWeight(FontWeight.Bold).margin({ top: 16, bottom: 4 })
Text('attributeModifier + AttributeModifier<T> 状态化节点修改器根因')
.fontSize(11).fontColor('#888').margin({ bottom: 8 })
// ✅ 场景 1:attributeModifier 绑定 MyButtonModifier(正确用法)
Column({ space: 6 }) {
Text('场景 1:attributeModifier 绑定 MyButtonModifier(API 12,class implements AttributeModifier<T>)')
.fontSize(12).fontColor('#2563eb').fontWeight(FontWeight.Bold)
Text('class MyButtonModifier implements AttributeModifier<ButtonAttribute>,applyNormalAttribute(instance) 改属性')
.fontSize(9).fontColor('#888')
// ✅ attributeModifier 绑定装饰器实例到组件(鸿蒙坑:attributeModifier 绑定 AttributeModifier<T> 实例)
Button('受 MyButtonModifier 装饰器控制的按钮')
.attributeModifier(myButtonModifier)
.height(40)
.margin({ top: 4 })
.onClick(() => {
this.pressedCount++
this.log = '✅ 装饰器控制的按钮点击成功(pressedCount=' + this.pressedCount + ')'
})
Button('① toggle MyButtonModifier 状态').height(30).fontSize(9).backgroundColor('#2563eb20')
.onClick(() => this.toggleButtonState())
Text(this.modifierStatus).fontSize(9).fontColor('#2563eb').margin({ top: 4 })
Text(`当前按钮状态:fontSize=${this.currentButtonFontSize} bgColor=${this.currentButtonBgColor}`)
.fontSize(8).fontColor('#2563eb').margin({ top: 2 })
}
.width('92%').padding(8).backgroundColor('#e0f0ff').borderRadius(8)
// ✅ 场景 2:attributeModifier 绑定 MyTextModifier
Column({ space: 6 }) {
Text('场景 2:attributeModifier 绑定 MyTextModifier(API 12,文本装饰器)')
.fontSize(12).fontColor('#ff6600').fontWeight(FontWeight.Bold)
Text('class MyTextModifier implements AttributeModifier<TextAttribute>,applyNormalAttribute(instance) 改属性')
.fontSize(9).fontColor('#888')
// ✅ attributeModifier 绑定文本装饰器
Text('受 MyTextModifier 装饰器控制的文本')
.attributeModifier(myTextModifier)
.margin({ top: 4 })
Button('② toggle MyTextModifier 状态').height(30).fontSize(9).backgroundColor('#ff660020')
.onClick(() => this.toggleTextState())
}
.width('92%').padding(8).backgroundColor('#fff3e0').borderRadius(8)
// ✅ 鸿蒙坑:arkts-no-method-reassignment 错误演示(注释说明)
Column({ space: 6 }) {
Text('鸿蒙坑:arkts-no-method-reassignment 编译错(applyNormalAttribute 是方法不是属性)')
.fontSize(12).fontColor('#dc3545').fontWeight(FontWeight.Bold)
Text('❌ buttonModifier.applyNormalAttribute = fn → 编译错 arkts-no-method-reassignment')
.fontSize(9).fontColor('#dc3545')
Text('✅ 正确:class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }')
.fontSize(9).fontColor('#28a745')
Text('鸿蒙坑根因:applyNormalAttribute 是方法声明不是属性,ArkTS 禁止给对象方法重新赋值')
.fontSize(8).fontColor('#6c757d').margin({ top: 4 })
}
.width('92%').padding(8).backgroundColor('#f8d7da').borderRadius(8)
// ✅ 鸿蒙 ArkUI.modifier 装饰器坑要点
Column({ space: 3 }) {
Text('鸿蒙 6.1 ArkUI.modifier 装饰器坑要点')
.fontSize(10).fontColor('#6c757d').fontWeight(FontWeight.Bold)
Text('① @ohos.arkui.modifier namespace API 12+(鸿蒙 6.1 API 23 基座),74 个 Modifier 类')
.fontSize(8).fontColor('#2563eb')
Text('② 每个 Modifier 类 extends 对应 Attribute 类 implements AttributeModifier<XxxAttribute>')
.fontSize(8).fontColor('#ff6600')
Text('③ applyNormalAttribute(instance: XxxAttribute): void 改属性(状态化节点修改器根因)')
.fontSize(8).fontColor('#28a745')
Text('④ instance 是 XxxAttribute 实例,改属性用同名 setter 方法(instance.fontSize/backgroundColor/fontColor)')
.fontSize(8).fontColor('#dc3545')
Text('⑤ ❌ applyNormalAttribute 是方法不是属性:buttonModifier.applyNormalAttribute = fn 编译错')
.fontSize(8).fontColor('#dc3545')
Text('⑥ ✅ 正确用法:class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }')
.fontSize(8).fontColor('#28a745')
Text('⑦ attributeModifier(modifier) 绑定装饰器实例到组件(不是 attribute 是装饰器绑定)')
.fontSize(8).fontColor('#ff6600')
Text('⑧ applyXxxAttribute 多状态:applyNormalAttribute/applyPressedAttribute/applyFocusedAttribute 等可选')
.fontSize(8).fontColor('#6c757d')
Text('⑨ 装饰器是节点修改器不是 Component——通过 applyXxxAttribute 方法改节点属性,不是声明式 UI')
.fontSize(8).fontColor('#ffc107')
Text('⑩ React 对比:modifier 不是 React.useReducer——鸿蒙装饰器是节点属性修改器不是状态管理 hook')
.fontSize(8).fontColor('#17a2b8')
}
.width('92%').padding(6).backgroundColor('#f8f9fa').borderRadius(8)
// ✅ 统计
Row({ space: 12 }) {
Text(`normal: ${this.normalCount}`).fontSize(9).fontColor('#28a745')
Text(`pressed: ${this.pressedCount}`).fontSize(9).fontColor('#dc3545')
Text(`focused: ${this.focusedCount}`).fontSize(9).fontColor('#ff6600')
}
.margin({ top: 6 })
Text(`日志:${this.log}`).fontSize(9).fontColor('#333').margin({ top: 6 })
Text('鸿蒙 6.1(API 12+)ArkUI.modifier:74 个 Modifier 类,attributeModifier + AttributeModifier<T> 状态化节点修改器')
.fontSize(8).fontColor('#6c757d').margin({ top: 6 })
}
.width('100%').height('100%').alignItems(HorizontalAlign.Center)
}
}
写鸿蒙 ArkUI 记住:modifier 不是 React.useReducer 是「节点属性修改器」——鸿蒙 6.1 API 23
@ohos.arkui.modifiernamespace(API 12+,74 个 Modifier 装饰器类,extends XxxAttribute implements AttributeModifier,SysCap SystemCapability.ArkUI.ArkUI.Full,@crossplatform @atomicservice)。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute(instance: T): void是方法声明不是属性(❌buttonModifier.applyNormalAttribute = fn编译错arkts-no-method-reassignment,ArkTS 禁止给对象方法重新赋值;✅ 正确用法class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }),attributeModifier(modifier)绑定装饰器实例到组件(不是 attribute 是装饰器绑定,命令式 setter),applyXxxAttribute多状态(Normal/Pressed/Focused/Disabled/Selected/PointerOver 等可选方法,首字母大写驼峰命名,instance 改属性用同名 setterinstance.fontSize()/instance.backgroundColor()/instance.fontColor())。节点属性修改器 applyNormalAttribute 是方法不是属性是鸿蒙 6.1 ArkUI.modifier 装饰器坑核心!
更多推荐




所有评论(0)